SlideShare una empresa de Scribd logo
1 de 38
Descargar para leer sin conexión
Bad Smells em 
Bancos de Dados 
@fabriziomello @guilhermeslac
Quem somos? 
Fabrízio Mello 
 Desenvolvedor PostgreSQL 
 Líder PostgreSQL Brasil 
 Pós-Graduando UniiRitter (Agile) 
 @fabriziomello 
 http://fabriziomello.github.io 
Guilherme Lacerda 
 Consultor e Professor Universitário (UniRitter, Unisinos e UFRGS) 
 Doutorando em Ciência da Computação (UFRGS) 
 @guilhermeslac 
 http://www.guilhermelacerda.net
Agenda 
 Introdução 
 Refatoração e Refatoração em BD 
 Database Smells e Refatorações 
 Considerações Finais
Problema com Bancos de Dados 
Tendem a se deteriorar ao longo do tempo. Alguns 
motivos: 
 crescimento volume de dados/transações; 
 aumento natural de usuários que o utilizam; 
 dificuldades na evolução do schema; 
 estratégias de manutenção.
Refatoração de Banco de Dados 
Deterioração + Mudanças em Requisitos = 
Necessidade de Refatoração 
Mas não é tão simples como parece: 
 além de manter comportamento também é preciso manter 
informação (dados) 
 acoplamento com diversas origens (apps, bds, integrações, 3rd, 
...)
Code Smell 
“É uma categoria comum de problema no código fonte 
que indica a necessidade de refatoração.” (Martin 
Fowler)
Database Smell 
“Similarmente aos Code Smells existem problemas 
comuns em bancos de dados que indicam uma 
potencial necessidade de refatoração.” (Scott Ambler)
Database Smell 
Multi-purpose column 
Se uma coluna for utilizada para vários fins, é 
provável que exista um código extra para garantir 
que a mesma seja usada corretamente e, muitas 
vezes, verificando valores de uma ou mais colunas.
Multi-purpose column 
CREATE TABLE pessoa ( 
id SERIAL PRIMARY KEY, 
tipo CHAR(1) CHECK (tipo IN ('F', 'J')), 
nome VARCHAR(100) NOT NULL, 
data DATE 
); 
Se tipo = 'F' então DATA = nascimento 
Se tipo = 'J' então DATA = inicio atividades
Multi-purpose column 
Sugestão(ões) Database Refactoring: 
 Split Column 
 Move Column
Database Smell 
Multi-purpose table 
Quando uma tabela é utilizada para armazenar vários 
tipos de entidades provavelmente existe uma falha de 
projeto.
Multi-purpose table 
CREATE TABLE pessoa ( 
id SERIAL PRIMARY KEY, 
nome VARCHAR(100) NOT NULL, 
nome_fantasia VARCHAR(100), 
cnpj CHAR(14), 
cpf CHAR(11), 
rg CHAR(10) 
); 
Se (CNPJ e NOME_FANTASIA = NULL) então NOME = nome pessoa física 
Se (CPF e RG = NULL) então NOME = razão social pessoa jurídica
Multi-purpose table 
Sugestão(ões) Database Refactoring: 
 Split Column 
 Move Column
Database Smell 
Redundant data 
É um problema sério em bases de dados, porque 
quando o dado é armazenado em vários locais, ocorre 
uma oportunidade de inconsistência.
Redundant data 
CREATE TABLE sys.usuario ( 
id SERIAL PRIMARY KEY, 
login VARCHAR(100) NOT NULL, 
nome VARCHAR(100) NOT NULL 
); 
CREATE TABLE rh.funcionario ( 
id SERIAL PRIMARY KEY, 
nome VARCHAR(100) NOT NULL, 
endereco VARCHAR(100), 
numero INTEGER, 
complemento VARCHAR(40) 
);
Redundant data 
Sugestão(ões) Database Refactoring: 
 Merge Tables 
 Move Data 
 Drop Column
Database Smell 
Tables with too many columns 
Quando uma tabela tem muitas colunas é indicativo de 
falta de coesão, pois está armazenando dados de 
várias entidades.
Table with too many columns 
CREATE TABLE pessoa ( 
id SERIAL PRIMARY KEY, 
nome VARCHAR(100) NOT NULL, 
end_entrega VARCHAR(200), 
end_cobranca VARCHAR(200), 
end_residenc VARCHAR(200), 
end_profiss VARCHAR(200), 
fone_celular VARCHAR(20), 
fone_casa VARCHAR(20), 
fone_fax VARCHAR(20), 
fone_contato VARCHAR(20) 
);
Table with too many columns 
CREATE TABLE parametro ( 
parametro1 VARCHAR(100), 
parametro2 VARCHAR(100), 
parametro3 VARCHAR(100), 
parametro4 VARCHAR(100), 
parametro5 VARCHAR(100), 
parametro6 VARCHAR(100), 
parametro7 VARCHAR(100), 
parametro8 VARCHAR(100), 
… 
parametroN VARCHAR(100), 
);
Table with too many columns 
Sugestão(ões) Database Refactoring: 
 Split Table 
 Move Column
Database Smell 
Tables with too many rows 
Tabelas muito grandes podem nos levar a problemas 
de performance. 
O custo (memória e tempo) para buscar ou alterar 
dados em uma tabela varia de acordo com o número 
de linhas.
Table with too many rows 
CREATE TABLE measurement ( 
city_id INTEGER NOT NULL, 
logdate DATE NOT NULL, 
peaktemp INTEGER, 
unitsales INTEGER 
); 
CREATE TABLE measurement_200602() INHERITS (measurement); 
CREATE TABLE measurement_200603() INHERITS (measurement); 
... 
CREATE TABLE measurement_200711() INHERITS (measurement); 
CREATE TABLE measurement_200712() INHERITS (measurement); 
CREATE TABLE measurement_200801() INHERITS (measurement);
Table with too many rows 
Sugestão(ões) Database Refactoring: 
 Split Table 
 Move Rows 
 Move Column
Database Smell 
Smart columns 
Coluna que armazena informações de mais de um 
contexto (concatenação de informação).
Smart Columns 
CREATE TABLE processo ( 
numero CHAR(10) PRIMARY KEY, 
... 
); 
CREATE TABLE debito ( 
processamento CHAR(15) PRIMARY KEY 
... 
); 
numero = 4 digitos ano + 6 digitos sequencial 
processamento = 4 digitos ano + 6 digitos sequencial + 2 digitos parcela + 2 
digitos total parcelas + 1 digito verificador
Smart Columns 
Sugestão(ões) Database Refactoring: 
 Split Column
Database Smell 
Phantom foreign-key 
Quando uma coluna em uma tabela pode receber um 
valor que dependendo de outra coluna estabelece 
relacionamento de chave estrangeira com outra 
tabela.
Phantom foreign-key 
CREATE TABLE tabela ( 
... 
tipo INTEGER, 
codigo INTEGER, 
... 
); 
Se TIPO = 1 entao CODIGO é ref. TABELA1 
Se TIPO = 2 entao CODIGO é ref. TABELA2 
Se TIPO = 3 entao CODIGO é ref. TABELA3
Phantom foreign-key 
Sugestão(ões) Database Refactoring: 
 Introduce new table 
 Introduce table constraint 
 Move column
Database Smell 
Wrong data type 
Tipos de dados possuem uma assinatura, que 
descreve as validações mínimas para seu uso.
Wrong data type 
CREATE TABLE pessoa ( 
id SERIAL PRIMARY KEY, 
nome VARCHAR(100) NOT NULL, 
cnpj CHAR(14), 
cpf CHAR(11), 
rg CHAR(10) 
); 
CREATE TABLE atributo_dinamico ( 
nome VARCHAR(100), 
tipo INTEGER, 
valor TEXT 
); 
CNPJ, CPF e RG não são números? 
VALOR é um campo "flex"
Wrong data type 
Sugestão(ões) Database Refactoring: 
 Replace column
Database Smell 
Outros smells detectados baseados em experiência 
(não estão na literatura): 
 Phantom foreign-key 
 Wrong data type 
 Trigger Spaghetti
Database Smell 
Fear or change 
Dentre os database smells citados, devemos ter 
atenção especial a este, pois pode ser considerado o 
pior de todos, pois: 
 Inibe a inovação, 
 Reduz a efetividade, 
 Produz ainda mais bagunça e 
 Ao longo do tempo a situação fica cada vez pior.
Considerações finais 
Área com campo vasto a ser explorado 
Taxonomia dos Database Smells 
Database Smells primitivos e compostos? 
Explorar outras formas de detecção 
Métricas, visualização, engenharia reversa, dependência cíclica 
Ferramentas de apoio
Referências 
●Refactoring Improving the Desing of Existing Code (Martin Fowler) 
●Refactoring Databases: Evolutionary Database Design (Scott 
Ambler e Pramod Sadalage) 
●http://martinfowler.com/books/refactoring.html 
●http://agiledata.org/essays/databaseRefactoring.html 
●http://www.agiledata.org/essays/databaseRefactoringSmells.html
Muito Obrigado! 
g u i l h e r mes l a c e rd a@g m a i l . c o m 
@g u i l h e r mes l a c 
fa b r i z i o me l l o@g m a i l . c o m 
@fa b r i z i o me l l o 
w w w . c o d i n g b y e x a m p l e . o rg 
w w w . o rg a n i z a c a o v i s u a l . n e t

Más contenido relacionado

La actualidad más candente (15)

Apostila etec excel
Apostila etec   excelApostila etec   excel
Apostila etec excel
 
Aula 11 banco de dados
Aula 11   banco de dadosAula 11   banco de dados
Aula 11 banco de dados
 
Aula 6
Aula 6Aula 6
Aula 6
 
Teclas de-atalho-access
Teclas de-atalho-accessTeclas de-atalho-access
Teclas de-atalho-access
 
Aula 12 banco de dados
Aula 12   banco de dadosAula 12   banco de dados
Aula 12 banco de dados
 
Comandos DML
Comandos DMLComandos DML
Comandos DML
 
Introdução ao Excel 2010
Introdução ao Excel 2010Introdução ao Excel 2010
Introdução ao Excel 2010
 
Sql com sql server básico - Bóson treinamentos
Sql com sql server básico - Bóson treinamentosSql com sql server básico - Bóson treinamentos
Sql com sql server básico - Bóson treinamentos
 
Aula 5
Aula 5Aula 5
Aula 5
 
Aula 9 banco de dados
Aula 9   banco de dadosAula 9   banco de dados
Aula 9 banco de dados
 
R para Iniciantes
R para IniciantesR para Iniciantes
R para Iniciantes
 
2862030
28620302862030
2862030
 
Sql básico - Teoria e prática: Um grande resumo
Sql básico - Teoria e prática: Um grande resumoSql básico - Teoria e prática: Um grande resumo
Sql básico - Teoria e prática: Um grande resumo
 
04 roteiro
04 roteiro04 roteiro
04 roteiro
 
Broffice x ofice
Broffice x oficeBroffice x ofice
Broffice x ofice
 

Destacado

Coding by Example - Tutorial Agiles 2012
Coding by Example - Tutorial Agiles 2012Coding by Example - Tutorial Agiles 2012
Coding by Example - Tutorial Agiles 2012Wildtech
 
(TDC2014) Oba! Cenários Complexos
(TDC2014) Oba! Cenários Complexos(TDC2014) Oba! Cenários Complexos
(TDC2014) Oba! Cenários ComplexosWildtech
 
CBSoft2013 - Tutorial Coding By Example
CBSoft2013 - Tutorial Coding By ExampleCBSoft2013 - Tutorial Coding By Example
CBSoft2013 - Tutorial Coding By ExampleWildtech
 
[XPConfBR2014] Desvendando o eXtreme Programming
[XPConfBR2014] Desvendando o eXtreme Programming[XPConfBR2014] Desvendando o eXtreme Programming
[XPConfBR2014] Desvendando o eXtreme ProgrammingWildtech
 
CBSoft 2013 - Descrição dos Problemas (CbE)
CBSoft 2013 - Descrição dos Problemas (CbE)CBSoft 2013 - Descrição dos Problemas (CbE)
CBSoft 2013 - Descrição dos Problemas (CbE)Wildtech
 
(AgileBrazil2014) Agilidade no Judiciário: um relato de experiência de Agile ...
(AgileBrazil2014) Agilidade no Judiciário: um relato de experiência de Agile ...(AgileBrazil2014) Agilidade no Judiciário: um relato de experiência de Agile ...
(AgileBrazil2014) Agilidade no Judiciário: um relato de experiência de Agile ...Wildtech
 
Swarm Debugging
Swarm DebuggingSwarm Debugging
Swarm DebuggingWildtech
 
Agile Clinic - Agile Coaching Patterns
Agile Clinic - Agile Coaching PatternsAgile Clinic - Agile Coaching Patterns
Agile Clinic - Agile Coaching PatternsWildtech
 
TDC 2016 - Agilidade além da TI
TDC 2016 - Agilidade além da TITDC 2016 - Agilidade além da TI
TDC 2016 - Agilidade além da TIWildtech
 
TDC 2016 - Retrospectivas como Catalisadores de Melhoria Contínua
TDC 2016 - Retrospectivas como Catalisadores de Melhoria ContínuaTDC 2016 - Retrospectivas como Catalisadores de Melhoria Contínua
TDC 2016 - Retrospectivas como Catalisadores de Melhoria ContínuaWildtech
 
AgileBrazil 2013 - Baby Steps Game
AgileBrazil 2013 - Baby Steps GameAgileBrazil 2013 - Baby Steps Game
AgileBrazil 2013 - Baby Steps GameWildtech
 
TDC 2016 - O Novo Professor
TDC 2016 - O Novo ProfessorTDC 2016 - O Novo Professor
TDC 2016 - O Novo ProfessorWildtech
 
[VEM2014] PolymorphicView: Visualizando o uso do Polimorfismo em Projetos de ...
[VEM2014] PolymorphicView: Visualizando o uso do Polimorfismo em Projetos de ...[VEM2014] PolymorphicView: Visualizando o uso do Polimorfismo em Projetos de ...
[VEM2014] PolymorphicView: Visualizando o uso do Polimorfismo em Projetos de ...Wildtech
 
AgileDay2012 - Resumo Coding By Example
AgileDay2012 - Resumo Coding By ExampleAgileDay2012 - Resumo Coding By Example
AgileDay2012 - Resumo Coding By ExampleWildtech
 
The Power of Retrospectives
The Power of RetrospectivesThe Power of Retrospectives
The Power of RetrospectivesWildtech
 
TDC 2016 - Desvendando o Onion Architecture
TDC 2016 - Desvendando o Onion ArchitectureTDC 2016 - Desvendando o Onion Architecture
TDC 2016 - Desvendando o Onion ArchitectureWildtech
 
Retrospectiva: O motor da melhoria contínua (4a. do Conhecimento - PROCERGS)
Retrospectiva: O motor da melhoria contínua (4a. do Conhecimento - PROCERGS)Retrospectiva: O motor da melhoria contínua (4a. do Conhecimento - PROCERGS)
Retrospectiva: O motor da melhoria contínua (4a. do Conhecimento - PROCERGS)Wildtech
 
QCon 2016 - Estratégias e Desafios na Implantação de Lean no Setor Público e ...
QCon 2016 - Estratégias e Desafios na Implantação de Lean no Setor Público e ...QCon 2016 - Estratégias e Desafios na Implantação de Lean no Setor Público e ...
QCon 2016 - Estratégias e Desafios na Implantação de Lean no Setor Público e ...Wildtech
 
5S em Código: Seminário de PHP "Show me the code!"
5S em Código: Seminário de PHP "Show me the code!"5S em Código: Seminário de PHP "Show me the code!"
5S em Código: Seminário de PHP "Show me the code!"Wildtech
 

Destacado (19)

Coding by Example - Tutorial Agiles 2012
Coding by Example - Tutorial Agiles 2012Coding by Example - Tutorial Agiles 2012
Coding by Example - Tutorial Agiles 2012
 
(TDC2014) Oba! Cenários Complexos
(TDC2014) Oba! Cenários Complexos(TDC2014) Oba! Cenários Complexos
(TDC2014) Oba! Cenários Complexos
 
CBSoft2013 - Tutorial Coding By Example
CBSoft2013 - Tutorial Coding By ExampleCBSoft2013 - Tutorial Coding By Example
CBSoft2013 - Tutorial Coding By Example
 
[XPConfBR2014] Desvendando o eXtreme Programming
[XPConfBR2014] Desvendando o eXtreme Programming[XPConfBR2014] Desvendando o eXtreme Programming
[XPConfBR2014] Desvendando o eXtreme Programming
 
CBSoft 2013 - Descrição dos Problemas (CbE)
CBSoft 2013 - Descrição dos Problemas (CbE)CBSoft 2013 - Descrição dos Problemas (CbE)
CBSoft 2013 - Descrição dos Problemas (CbE)
 
(AgileBrazil2014) Agilidade no Judiciário: um relato de experiência de Agile ...
(AgileBrazil2014) Agilidade no Judiciário: um relato de experiência de Agile ...(AgileBrazil2014) Agilidade no Judiciário: um relato de experiência de Agile ...
(AgileBrazil2014) Agilidade no Judiciário: um relato de experiência de Agile ...
 
Swarm Debugging
Swarm DebuggingSwarm Debugging
Swarm Debugging
 
Agile Clinic - Agile Coaching Patterns
Agile Clinic - Agile Coaching PatternsAgile Clinic - Agile Coaching Patterns
Agile Clinic - Agile Coaching Patterns
 
TDC 2016 - Agilidade além da TI
TDC 2016 - Agilidade além da TITDC 2016 - Agilidade além da TI
TDC 2016 - Agilidade além da TI
 
TDC 2016 - Retrospectivas como Catalisadores de Melhoria Contínua
TDC 2016 - Retrospectivas como Catalisadores de Melhoria ContínuaTDC 2016 - Retrospectivas como Catalisadores de Melhoria Contínua
TDC 2016 - Retrospectivas como Catalisadores de Melhoria Contínua
 
AgileBrazil 2013 - Baby Steps Game
AgileBrazil 2013 - Baby Steps GameAgileBrazil 2013 - Baby Steps Game
AgileBrazil 2013 - Baby Steps Game
 
TDC 2016 - O Novo Professor
TDC 2016 - O Novo ProfessorTDC 2016 - O Novo Professor
TDC 2016 - O Novo Professor
 
[VEM2014] PolymorphicView: Visualizando o uso do Polimorfismo em Projetos de ...
[VEM2014] PolymorphicView: Visualizando o uso do Polimorfismo em Projetos de ...[VEM2014] PolymorphicView: Visualizando o uso do Polimorfismo em Projetos de ...
[VEM2014] PolymorphicView: Visualizando o uso do Polimorfismo em Projetos de ...
 
AgileDay2012 - Resumo Coding By Example
AgileDay2012 - Resumo Coding By ExampleAgileDay2012 - Resumo Coding By Example
AgileDay2012 - Resumo Coding By Example
 
The Power of Retrospectives
The Power of RetrospectivesThe Power of Retrospectives
The Power of Retrospectives
 
TDC 2016 - Desvendando o Onion Architecture
TDC 2016 - Desvendando o Onion ArchitectureTDC 2016 - Desvendando o Onion Architecture
TDC 2016 - Desvendando o Onion Architecture
 
Retrospectiva: O motor da melhoria contínua (4a. do Conhecimento - PROCERGS)
Retrospectiva: O motor da melhoria contínua (4a. do Conhecimento - PROCERGS)Retrospectiva: O motor da melhoria contínua (4a. do Conhecimento - PROCERGS)
Retrospectiva: O motor da melhoria contínua (4a. do Conhecimento - PROCERGS)
 
QCon 2016 - Estratégias e Desafios na Implantação de Lean no Setor Público e ...
QCon 2016 - Estratégias e Desafios na Implantação de Lean no Setor Público e ...QCon 2016 - Estratégias e Desafios na Implantação de Lean no Setor Público e ...
QCon 2016 - Estratégias e Desafios na Implantação de Lean no Setor Público e ...
 
5S em Código: Seminário de PHP "Show me the code!"
5S em Código: Seminário de PHP "Show me the code!"5S em Código: Seminário de PHP "Show me the code!"
5S em Código: Seminário de PHP "Show me the code!"
 

Similar a [Agile brazil2014] Bad Smells em Bancos de Dados

Bad Smells (mal cheiros) em Bancos de Dados
Bad Smells (mal cheiros) em Bancos de DadosBad Smells (mal cheiros) em Bancos de Dados
Bad Smells (mal cheiros) em Bancos de DadosFabrízio Mello
 
Bad Smells (mal cheiros) em Bancos de Dados
Bad Smells (mal cheiros) em Bancos de DadosBad Smells (mal cheiros) em Bancos de Dados
Bad Smells (mal cheiros) em Bancos de DadosFabrízio Mello
 
Curso de PostgreSQL: Um pouco Além dos Comandos
Curso de PostgreSQL: Um pouco Além dos ComandosCurso de PostgreSQL: Um pouco Além dos Comandos
Curso de PostgreSQL: Um pouco Além dos ComandosMarcos Thomaz
 
Linguagem SQL (com MySQL)
Linguagem SQL (com MySQL)Linguagem SQL (com MySQL)
Linguagem SQL (com MySQL)Marco Pinheiro
 
Progweb Aula7
Progweb Aula7Progweb Aula7
Progweb Aula7softeam
 
Banco de dados aula 4
Banco de dados aula 4Banco de dados aula 4
Banco de dados aula 4Ed W. Jr
 
Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)
Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)
Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)Dickson S. Guedes
 
Alto desempenho com banco de dados MySQL
Alto desempenho com banco de dados MySQLAlto desempenho com banco de dados MySQL
Alto desempenho com banco de dados MySQLJonas Silveira
 
MySQL - Wagner Bonfiglio - Navegg
MySQL - Wagner Bonfiglio - NaveggMySQL - Wagner Bonfiglio - Navegg
MySQL - Wagner Bonfiglio - NaveggFelipe Guimarães
 
Minicurso PostgreSQl
Minicurso PostgreSQlMinicurso PostgreSQl
Minicurso PostgreSQlCezar Souza
 
TOTVS LINHA RM TREINAMENTO SQL
TOTVS LINHA RM TREINAMENTO SQLTOTVS LINHA RM TREINAMENTO SQL
TOTVS LINHA RM TREINAMENTO SQLFábio Delboni
 
Oracle 11g - Fundamentos
Oracle 11g - FundamentosOracle 11g - Fundamentos
Oracle 11g - FundamentosGustavo Sávio
 
Fundamentos de SQL - Parte 3 de 8
Fundamentos de SQL - Parte 3 de 8Fundamentos de SQL - Parte 3 de 8
Fundamentos de SQL - Parte 3 de 8Emiliano Barbosa
 

Similar a [Agile brazil2014] Bad Smells em Bancos de Dados (20)

Bad Smells (mal cheiros) em Bancos de Dados
Bad Smells (mal cheiros) em Bancos de DadosBad Smells (mal cheiros) em Bancos de Dados
Bad Smells (mal cheiros) em Bancos de Dados
 
Apostila - Banco de Dados
Apostila - Banco de DadosApostila - Banco de Dados
Apostila - Banco de Dados
 
Bad Smells (mal cheiros) em Bancos de Dados
Bad Smells (mal cheiros) em Bancos de DadosBad Smells (mal cheiros) em Bancos de Dados
Bad Smells (mal cheiros) em Bancos de Dados
 
Curso de PostgreSQL: Um pouco Além dos Comandos
Curso de PostgreSQL: Um pouco Além dos ComandosCurso de PostgreSQL: Um pouco Além dos Comandos
Curso de PostgreSQL: Um pouco Além dos Comandos
 
Aula 10 banco de dados
Aula 10   banco de dadosAula 10   banco de dados
Aula 10 banco de dados
 
Aula 11 banco de dados
Aula 11   banco de dadosAula 11   banco de dados
Aula 11 banco de dados
 
Linguagem SQL (com MySQL)
Linguagem SQL (com MySQL)Linguagem SQL (com MySQL)
Linguagem SQL (com MySQL)
 
Progweb Aula7
Progweb Aula7Progweb Aula7
Progweb Aula7
 
Banco de dados aula 4
Banco de dados aula 4Banco de dados aula 4
Banco de dados aula 4
 
Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)
Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)
Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)
 
Alto desempenho com banco de dados MySQL
Alto desempenho com banco de dados MySQLAlto desempenho com banco de dados MySQL
Alto desempenho com banco de dados MySQL
 
Aula 10 banco de dados
Aula 10   banco de dadosAula 10   banco de dados
Aula 10 banco de dados
 
MySQL - Wagner Bonfiglio - Navegg
MySQL - Wagner Bonfiglio - NaveggMySQL - Wagner Bonfiglio - Navegg
MySQL - Wagner Bonfiglio - Navegg
 
MySQL - Workshop Buscapé
MySQL - Workshop BuscapéMySQL - Workshop Buscapé
MySQL - Workshop Buscapé
 
Minicurso PostgreSQl
Minicurso PostgreSQlMinicurso PostgreSQl
Minicurso PostgreSQl
 
TOTVS LINHA RM TREINAMENTO SQL
TOTVS LINHA RM TREINAMENTO SQLTOTVS LINHA RM TREINAMENTO SQL
TOTVS LINHA RM TREINAMENTO SQL
 
Oracle 11g - Fundamentos
Oracle 11g - FundamentosOracle 11g - Fundamentos
Oracle 11g - Fundamentos
 
Otimizando a performance com in memory no sql 2016
Otimizando a performance com in memory no sql 2016Otimizando a performance com in memory no sql 2016
Otimizando a performance com in memory no sql 2016
 
Sql
SqlSql
Sql
 
Fundamentos de SQL - Parte 3 de 8
Fundamentos de SQL - Parte 3 de 8Fundamentos de SQL - Parte 3 de 8
Fundamentos de SQL - Parte 3 de 8
 

Más de Wildtech

Voltando para as raízes do desenvolvimento ágil
Voltando para as raízes do desenvolvimento ágilVoltando para as raízes do desenvolvimento ágil
Voltando para as raízes do desenvolvimento ágilWildtech
 
O que a agilidade me ensinou no desenvolvimento de software
O que a agilidade me ensinou no desenvolvimento de softwareO que a agilidade me ensinou no desenvolvimento de software
O que a agilidade me ensinou no desenvolvimento de softwareWildtech
 
XP e a Academia
XP e a AcademiaXP e a Academia
XP e a AcademiaWildtech
 
Abordagens para adoção/transformação ágil através de mentoring e coaching
Abordagens para adoção/transformação ágil através de mentoring e coachingAbordagens para adoção/transformação ágil através de mentoring e coaching
Abordagens para adoção/transformação ágil através de mentoring e coachingWildtech
 
Descrição Tutorial Coding By Example (CBSoft2013)
Descrição Tutorial Coding By Example (CBSoft2013)Descrição Tutorial Coding By Example (CBSoft2013)
Descrição Tutorial Coding By Example (CBSoft2013)Wildtech
 
Agile Brazil 2012 - Tutorial Coding By Example
Agile Brazil 2012 - Tutorial Coding By ExampleAgile Brazil 2012 - Tutorial Coding By Example
Agile Brazil 2012 - Tutorial Coding By ExampleWildtech
 
Adoção do CMMI e Metodologias Ágeis em Empresas Brasileiras
Adoção do CMMI e Metodologias Ágeis em Empresas BrasileirasAdoção do CMMI e Metodologias Ágeis em Empresas Brasileiras
Adoção do CMMI e Metodologias Ágeis em Empresas BrasileirasWildtech
 
Agile workshop FACENSA
Agile workshop FACENSAAgile workshop FACENSA
Agile workshop FACENSAWildtech
 
Tbd demystified agiles2011
Tbd demystified agiles2011Tbd demystified agiles2011
Tbd demystified agiles2011Wildtech
 
Bate-papo Trunk Based Development
Bate-papo Trunk Based DevelopmentBate-papo Trunk Based Development
Bate-papo Trunk Based DevelopmentWildtech
 
IPA Conhecendo XP
IPA Conhecendo XPIPA Conhecendo XP
IPA Conhecendo XPWildtech
 

Más de Wildtech (11)

Voltando para as raízes do desenvolvimento ágil
Voltando para as raízes do desenvolvimento ágilVoltando para as raízes do desenvolvimento ágil
Voltando para as raízes do desenvolvimento ágil
 
O que a agilidade me ensinou no desenvolvimento de software
O que a agilidade me ensinou no desenvolvimento de softwareO que a agilidade me ensinou no desenvolvimento de software
O que a agilidade me ensinou no desenvolvimento de software
 
XP e a Academia
XP e a AcademiaXP e a Academia
XP e a Academia
 
Abordagens para adoção/transformação ágil através de mentoring e coaching
Abordagens para adoção/transformação ágil através de mentoring e coachingAbordagens para adoção/transformação ágil através de mentoring e coaching
Abordagens para adoção/transformação ágil através de mentoring e coaching
 
Descrição Tutorial Coding By Example (CBSoft2013)
Descrição Tutorial Coding By Example (CBSoft2013)Descrição Tutorial Coding By Example (CBSoft2013)
Descrição Tutorial Coding By Example (CBSoft2013)
 
Agile Brazil 2012 - Tutorial Coding By Example
Agile Brazil 2012 - Tutorial Coding By ExampleAgile Brazil 2012 - Tutorial Coding By Example
Agile Brazil 2012 - Tutorial Coding By Example
 
Adoção do CMMI e Metodologias Ágeis em Empresas Brasileiras
Adoção do CMMI e Metodologias Ágeis em Empresas BrasileirasAdoção do CMMI e Metodologias Ágeis em Empresas Brasileiras
Adoção do CMMI e Metodologias Ágeis em Empresas Brasileiras
 
Agile workshop FACENSA
Agile workshop FACENSAAgile workshop FACENSA
Agile workshop FACENSA
 
Tbd demystified agiles2011
Tbd demystified agiles2011Tbd demystified agiles2011
Tbd demystified agiles2011
 
Bate-papo Trunk Based Development
Bate-papo Trunk Based DevelopmentBate-papo Trunk Based Development
Bate-papo Trunk Based Development
 
IPA Conhecendo XP
IPA Conhecendo XPIPA Conhecendo XP
IPA Conhecendo XP
 

[Agile brazil2014] Bad Smells em Bancos de Dados

  • 1. Bad Smells em Bancos de Dados @fabriziomello @guilhermeslac
  • 2. Quem somos? Fabrízio Mello  Desenvolvedor PostgreSQL  Líder PostgreSQL Brasil  Pós-Graduando UniiRitter (Agile)  @fabriziomello  http://fabriziomello.github.io Guilherme Lacerda  Consultor e Professor Universitário (UniRitter, Unisinos e UFRGS)  Doutorando em Ciência da Computação (UFRGS)  @guilhermeslac  http://www.guilhermelacerda.net
  • 3. Agenda  Introdução  Refatoração e Refatoração em BD  Database Smells e Refatorações  Considerações Finais
  • 4. Problema com Bancos de Dados Tendem a se deteriorar ao longo do tempo. Alguns motivos:  crescimento volume de dados/transações;  aumento natural de usuários que o utilizam;  dificuldades na evolução do schema;  estratégias de manutenção.
  • 5. Refatoração de Banco de Dados Deterioração + Mudanças em Requisitos = Necessidade de Refatoração Mas não é tão simples como parece:  além de manter comportamento também é preciso manter informação (dados)  acoplamento com diversas origens (apps, bds, integrações, 3rd, ...)
  • 6. Code Smell “É uma categoria comum de problema no código fonte que indica a necessidade de refatoração.” (Martin Fowler)
  • 7. Database Smell “Similarmente aos Code Smells existem problemas comuns em bancos de dados que indicam uma potencial necessidade de refatoração.” (Scott Ambler)
  • 8. Database Smell Multi-purpose column Se uma coluna for utilizada para vários fins, é provável que exista um código extra para garantir que a mesma seja usada corretamente e, muitas vezes, verificando valores de uma ou mais colunas.
  • 9. Multi-purpose column CREATE TABLE pessoa ( id SERIAL PRIMARY KEY, tipo CHAR(1) CHECK (tipo IN ('F', 'J')), nome VARCHAR(100) NOT NULL, data DATE ); Se tipo = 'F' então DATA = nascimento Se tipo = 'J' então DATA = inicio atividades
  • 10. Multi-purpose column Sugestão(ões) Database Refactoring:  Split Column  Move Column
  • 11. Database Smell Multi-purpose table Quando uma tabela é utilizada para armazenar vários tipos de entidades provavelmente existe uma falha de projeto.
  • 12. Multi-purpose table CREATE TABLE pessoa ( id SERIAL PRIMARY KEY, nome VARCHAR(100) NOT NULL, nome_fantasia VARCHAR(100), cnpj CHAR(14), cpf CHAR(11), rg CHAR(10) ); Se (CNPJ e NOME_FANTASIA = NULL) então NOME = nome pessoa física Se (CPF e RG = NULL) então NOME = razão social pessoa jurídica
  • 13. Multi-purpose table Sugestão(ões) Database Refactoring:  Split Column  Move Column
  • 14. Database Smell Redundant data É um problema sério em bases de dados, porque quando o dado é armazenado em vários locais, ocorre uma oportunidade de inconsistência.
  • 15. Redundant data CREATE TABLE sys.usuario ( id SERIAL PRIMARY KEY, login VARCHAR(100) NOT NULL, nome VARCHAR(100) NOT NULL ); CREATE TABLE rh.funcionario ( id SERIAL PRIMARY KEY, nome VARCHAR(100) NOT NULL, endereco VARCHAR(100), numero INTEGER, complemento VARCHAR(40) );
  • 16. Redundant data Sugestão(ões) Database Refactoring:  Merge Tables  Move Data  Drop Column
  • 17. Database Smell Tables with too many columns Quando uma tabela tem muitas colunas é indicativo de falta de coesão, pois está armazenando dados de várias entidades.
  • 18. Table with too many columns CREATE TABLE pessoa ( id SERIAL PRIMARY KEY, nome VARCHAR(100) NOT NULL, end_entrega VARCHAR(200), end_cobranca VARCHAR(200), end_residenc VARCHAR(200), end_profiss VARCHAR(200), fone_celular VARCHAR(20), fone_casa VARCHAR(20), fone_fax VARCHAR(20), fone_contato VARCHAR(20) );
  • 19. Table with too many columns CREATE TABLE parametro ( parametro1 VARCHAR(100), parametro2 VARCHAR(100), parametro3 VARCHAR(100), parametro4 VARCHAR(100), parametro5 VARCHAR(100), parametro6 VARCHAR(100), parametro7 VARCHAR(100), parametro8 VARCHAR(100), … parametroN VARCHAR(100), );
  • 20. Table with too many columns Sugestão(ões) Database Refactoring:  Split Table  Move Column
  • 21. Database Smell Tables with too many rows Tabelas muito grandes podem nos levar a problemas de performance. O custo (memória e tempo) para buscar ou alterar dados em uma tabela varia de acordo com o número de linhas.
  • 22. Table with too many rows CREATE TABLE measurement ( city_id INTEGER NOT NULL, logdate DATE NOT NULL, peaktemp INTEGER, unitsales INTEGER ); CREATE TABLE measurement_200602() INHERITS (measurement); CREATE TABLE measurement_200603() INHERITS (measurement); ... CREATE TABLE measurement_200711() INHERITS (measurement); CREATE TABLE measurement_200712() INHERITS (measurement); CREATE TABLE measurement_200801() INHERITS (measurement);
  • 23. Table with too many rows Sugestão(ões) Database Refactoring:  Split Table  Move Rows  Move Column
  • 24. Database Smell Smart columns Coluna que armazena informações de mais de um contexto (concatenação de informação).
  • 25. Smart Columns CREATE TABLE processo ( numero CHAR(10) PRIMARY KEY, ... ); CREATE TABLE debito ( processamento CHAR(15) PRIMARY KEY ... ); numero = 4 digitos ano + 6 digitos sequencial processamento = 4 digitos ano + 6 digitos sequencial + 2 digitos parcela + 2 digitos total parcelas + 1 digito verificador
  • 26. Smart Columns Sugestão(ões) Database Refactoring:  Split Column
  • 27. Database Smell Phantom foreign-key Quando uma coluna em uma tabela pode receber um valor que dependendo de outra coluna estabelece relacionamento de chave estrangeira com outra tabela.
  • 28. Phantom foreign-key CREATE TABLE tabela ( ... tipo INTEGER, codigo INTEGER, ... ); Se TIPO = 1 entao CODIGO é ref. TABELA1 Se TIPO = 2 entao CODIGO é ref. TABELA2 Se TIPO = 3 entao CODIGO é ref. TABELA3
  • 29. Phantom foreign-key Sugestão(ões) Database Refactoring:  Introduce new table  Introduce table constraint  Move column
  • 30. Database Smell Wrong data type Tipos de dados possuem uma assinatura, que descreve as validações mínimas para seu uso.
  • 31. Wrong data type CREATE TABLE pessoa ( id SERIAL PRIMARY KEY, nome VARCHAR(100) NOT NULL, cnpj CHAR(14), cpf CHAR(11), rg CHAR(10) ); CREATE TABLE atributo_dinamico ( nome VARCHAR(100), tipo INTEGER, valor TEXT ); CNPJ, CPF e RG não são números? VALOR é um campo "flex"
  • 32. Wrong data type Sugestão(ões) Database Refactoring:  Replace column
  • 33. Database Smell Outros smells detectados baseados em experiência (não estão na literatura):  Phantom foreign-key  Wrong data type  Trigger Spaghetti
  • 34. Database Smell Fear or change Dentre os database smells citados, devemos ter atenção especial a este, pois pode ser considerado o pior de todos, pois:  Inibe a inovação,  Reduz a efetividade,  Produz ainda mais bagunça e  Ao longo do tempo a situação fica cada vez pior.
  • 35. Considerações finais Área com campo vasto a ser explorado Taxonomia dos Database Smells Database Smells primitivos e compostos? Explorar outras formas de detecção Métricas, visualização, engenharia reversa, dependência cíclica Ferramentas de apoio
  • 36.
  • 37. Referências ●Refactoring Improving the Desing of Existing Code (Martin Fowler) ●Refactoring Databases: Evolutionary Database Design (Scott Ambler e Pramod Sadalage) ●http://martinfowler.com/books/refactoring.html ●http://agiledata.org/essays/databaseRefactoring.html ●http://www.agiledata.org/essays/databaseRefactoringSmells.html
  • 38. Muito Obrigado! g u i l h e r mes l a c e rd a@g m a i l . c o m @g u i l h e r mes l a c fa b r i z i o me l l o@g m a i l . c o m @fa b r i z i o me l l o w w w . c o d i n g b y e x a m p l e . o rg w w w . o rg a n i z a c a o v i s u a l . n e t