Download - Bad Smells (mal cheiros) em Bancos de Dados
Bad Smells (mal cheiros) em Bancos de Dados
timbiraA empresa brasileira de PostgreSQL
TDC2013, Porto Alegre, 2013-10-26
Palestrante timbira
• Fabrízio de Royes Mello• Desenvolvedor PostgreSQL• Líder do PostgreSQL Brasil• Pós-Graduando Uniritter (Agile)• @fabriziomello• http://fabriziomello.blogspot.com
• Timbira• Consultor/Mentor/Coach• A empresa brasileira de PostgreSQL• Consultoria• Desenvolvimento• Suporte 24x7• Treinamento
Timbira - A empresa brasileira de PostgreSQL 2 / 39
Sobre este material timbira
• esta apresentação está disponível em:http://www.timbira.com.br/material
• esta apresentação está sob licença Creative CommonsAtribuição 3.0 Brasil :http://www.creativecommons.org/licenses/by/3.0/br
• Embora este material tenha sido elaborado com todaprecaução, os autores não assumem quaisquerresponsabilidades por erros, omissões ou danos resultantes dautilização das informações aqui contidas.
• Se você encontrar qualquer erro, por favor reporte-o [email protected]
Resumo timbira
1 Prelúdio
2 Introdução
3 Bad Smells
4 Considerações Finais
Timbira - A empresa brasileira de PostgreSQL 1 / 39
Como tudo começou na minha vida... timbira
• 1993 - Basic• 1994 - CLIPPER (e um pouco de C)• 1996 - C e Pascal• 1998 - SQL - mudou minha vida ;-)• 1999 - Teoria Relacional• ...• 2004 - Web (PHP, HTML, CSS, Javascript)• ...• 2009 - Database Refactoring• ...• 2013 - Bad Smells em Bancos de Dados
Timbira - A empresa brasileira de PostgreSQL 2 / 39
Resumo timbira
1 Prelúdio
2 Introdução
3 Bad Smells
4 Considerações Finais
Timbira - A empresa brasileira de PostgreSQL 3 / 39
Bancos de Dados timbira
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.
Timbira - A empresa brasileira de PostgreSQL 4 / 39
Refatoração em Bancos de Dados timbira
Deterioração + Mudanças em Requisitos =Necessidade de Refatoração.
Mas não é tão simples assim:
• além de manter comportamento também é preciso manterinformação (dados);
• acoplamento com diversas origens (apps, bds, integrações,3rd, ...)
Timbira - A empresa brasileira de PostgreSQL 5 / 39
Refatoração em Bancos de Dados timbira
Deterioração + Mudanças em Requisitos =Necessidade de Refatoração.
Mas não é tão simples assim:
• além de manter comportamento também é preciso manterinformação (dados);
• acoplamento com diversas origens (apps, bds, integrações,3rd, ...)
Timbira - A empresa brasileira de PostgreSQL 5 / 39
Resumo timbira
1 Prelúdio
2 Introdução
3 Bad Smells
4 Considerações Finais
Timbira - A empresa brasileira de PostgreSQL 6 / 39
Code Smell timbira
É uma categoria comum de problema no código fonte que indicaa necessidade de refatoração. (Martin Fowler)
Timbira - A empresa brasileira de PostgreSQL 7 / 39
Database Smell timbira
Similarmente aos Code Smells existem problemas comuns embancos de dados que indicam uma potencial necessidade derefatoração. (Scott Ambler)
Timbira - A empresa brasileira de PostgreSQL 8 / 39
Database Smell timbira
Multi-purpose columnSe uma coluna for utilizada para vários fins, é provável que existaum código extra para garantir que a mesma seja usadacorretamente e, muitas vezes, verificando valores de uma ou maiscolunas.
Timbira - A empresa brasileira de PostgreSQL 9 / 39
Multi-purpose column timbira
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
Timbira - A empresa brasileira de PostgreSQL 10 / 39
Multi-purpose column timbira
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
Timbira - A empresa brasileira de PostgreSQL 10 / 39
Multi-purpose column timbira
Sugestão(ões) Database Refactoring:• Split Column• Move Column
Timbira - A empresa brasileira de PostgreSQL 11 / 39
Database Smell timbira
Multi-purpose tableQuando uma tabela é utilizada para armazenar vários tipos deentidades provavelmente existe uma falha de projeto.
Timbira - A empresa brasileira de PostgreSQL 12 / 39
Multi-purpose table timbira
CREATE TABLE pessoa (id SERIAL PRIMARY KEY,tipo CHAR(1) CHECK (tipo IN (’F’, ’J’)),nome VARCHAR(100) NOT NULL,nome_fantasia VARCHAR(100),cnpj CHAR(14),cpf CHAR(11),rg CHAR(10),data DATE
);
• Se tipo = ’F’ então NOME = nome,• Se tipo = ’J’ então NOME = razão social• Se tipo = ’F’ então CNPJ e NOME_FANTASIA = NULL• Se tipo = ’J’ então CPF e RG = NULL
Timbira - A empresa brasileira de PostgreSQL 13 / 39
Multi-purpose table timbira
CREATE TABLE pessoa (id SERIAL PRIMARY KEY,tipo CHAR(1) CHECK (tipo IN (’F’, ’J’)),nome VARCHAR(100) NOT NULL,nome_fantasia VARCHAR(100),cnpj CHAR(14),cpf CHAR(11),rg CHAR(10),data DATE
);
• Se tipo = ’F’ então NOME = nome,• Se tipo = ’J’ então NOME = razão social• Se tipo = ’F’ então CNPJ e NOME_FANTASIA = NULL• Se tipo = ’J’ então CPF e RG = NULL
Timbira - A empresa brasileira de PostgreSQL 13 / 39
Multi-purpose table timbira
Sugestão(ões) Database Refactoring:• Split Column• Move Column• Split Table
Timbira - A empresa brasileira de PostgreSQL 14 / 39
Database Smell timbira
Redundant dataÉ um problema sério em bases de dados porque quando o dado éarmazenado em vários locais, ocorre uma oportunidade deinconsistência.
Timbira - A empresa brasileira de PostgreSQL 15 / 39
Redundant data timbira
CREATE TABLE sys.usuario (id SERIAL PRIMARY KEY,nome VARCHAR(100) NOT NULL,endereco VARCHAR(100),numero INTEGER,complemento VARCHAR(40)
);
CREATE TABLE rh.funcionario (id SERIAL PRIMARY KEY,nome VARCHAR(100) NOT NULL,endereco VARCHAR(100),numero INTEGER,complemento VARCHAR(40)
);
Timbira - A empresa brasileira de PostgreSQL 16 / 39
Redundant data timbira
Sugestão(ões) Database Refactoring:• Merge Tables• Move Data• Drop Column
Timbira - A empresa brasileira de PostgreSQL 17 / 39
Database Smell timbira
Tables with too many columnsQuando uma tabela tem muitas colunas é indicativo de falta decoesão, pois está armazenando dados de várias entidades.
Timbira - A empresa brasileira de PostgreSQL 18 / 39
Tables with too many columns timbira
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)
);
Timbira - A empresa brasileira de PostgreSQL 19 / 39
Tables with too many columns timbira
CREATE TABLE parametro (parametro1 VARCHAR(100),parametro2 VARCHAR(100),parametro3 VARCHAR(100),parametro4 VARCHAR(100),parametro5 VARCHAR(100),parametro6 VARCHAR(100),...parametroN VARCHAR(100)
);
Timbira - A empresa brasileira de PostgreSQL 20 / 39
Tables with too many columns timbira
Sugestão(ões) Database Refactoring:• Split Table• Move Column
Timbira - A empresa brasileira de PostgreSQL 21 / 39
Database Smell timbira
Tables with too many rowsTabelas muito grandes podem nos levar a problemas deperformance.O custo (memória e tempo) para buscar ou alterar dados em umatabela varia de acordo com o número de linhas.
Timbira - A empresa brasileira de PostgreSQL 22 / 39
Tables with too many rows timbira
CREATE TABLE measurement (city_id int not null,logdate date not null,peaktemp int,unitsales int
);
CREATE TABLE measurement_y2006m02 ( ) INHERITS (measurement);CREATE TABLE measurement_y2006m03 ( ) INHERITS (measurement);...CREATE TABLE measurement_y2007m11 ( ) INHERITS (measurement);CREATE TABLE measurement_y2007m12 ( ) INHERITS (measurement);CREATE TABLE measurement_y2008m01 ( ) INHERITS (measurement);
Timbira - A empresa brasileira de PostgreSQL 23 / 39
Tables with too many rows timbira
Sugestão(ões) Database Refactoring:• Split Table• Move Rows• Move Column
Timbira - A empresa brasileira de PostgreSQL 24 / 39
Database Smell timbira
Smart columnsColuna onde em diferentes posições do dado representam conceitosdiferentes.
Timbira - A empresa brasileira de PostgreSQL 25 / 39
Smart columns timbira
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
Timbira - A empresa brasileira de PostgreSQL 26 / 39
Smart columns timbira
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
Timbira - A empresa brasileira de PostgreSQL 26 / 39
Smart columns timbira
Sugestão(ões) Database Refactoring:• Split Column
Timbira - A empresa brasileira de PostgreSQL 27 / 39
Database Smell timbira
Phantom foreign-keyQuando uma coluna em uma tabela pode receber um valor quedependendo de outra coluna estabelece relacionamento de chaveestrangeira com outra tabela.
Timbira - A empresa brasileira de PostgreSQL 28 / 39
Phantom foreign-key timbira
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• ...
Timbira - A empresa brasileira de PostgreSQL 29 / 39
Phantom foreign-key timbira
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• ...
Timbira - A empresa brasileira de PostgreSQL 29 / 39
Phantom foreign-key timbira
Sugestão(ões) Database Refactoring:• Introduce new table• Introduce table constraint• Move Column
Timbira - A empresa brasileira de PostgreSQL 30 / 39
Database Smell timbira
Wrong data typeTipos de dados possuem uma assinatura, que descreve asvalidações mínimas para seu uso.
Timbira - A empresa brasileira de PostgreSQL 31 / 39
Wrong data type timbira
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"
Timbira - A empresa brasileira de PostgreSQL 32 / 39
Wrong data type timbira
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"
Timbira - A empresa brasileira de PostgreSQL 32 / 39
Wrong data type timbira
Sugestão(ões) Database Refactoring:• Replace column
Timbira - A empresa brasileira de PostgreSQL 33 / 39
Database Smell timbira
Smells detectados pela minha experiência (não estão naliteratura):
• Phantom foreign-key• Wrong data type• Trigger Spaghetti
Timbira - A empresa brasileira de PostgreSQL 34 / 39
Database Smell timbira
Fear of changeDentre os database smells citados, devemos ter atenção especial aeste, 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.
"Lempre-se do valor Coragem do XP!!!!"
Timbira - A empresa brasileira de PostgreSQL 35 / 39
Resumo timbira
1 Prelúdio
2 Introdução
3 Bad Smells
4 Considerações Finais
Timbira - A empresa brasileira de PostgreSQL 36 / 39
Considerações Finais timbira
• Coragem para evoluir• Taxonomia dos Database Smells• Ferramenta para detecção
Timbira - A empresa brasileira de PostgreSQL 37 / 39
Referências timbira
• Refactoring Improving the Desing of Existing Code (MartinFowler)
• Refactoring Databases: Evolutionary Database Design (ScottAmbler e Pramod Sadalage)
• http://martinfowler.com/books/refactoring.html• http:
//agiledata.org/essays/databaseRefactoring.html• http://www.agiledata.org/essays/
databaseRefactoringSmells.html
Timbira - A empresa brasileira de PostgreSQL 38 / 39
Perguntas timbira
?
Fabrízio de Royes Mello@fabriziomello
[email protected]://www.timbira.com.br
http://slideshare.net/fabriziomello
Timbira - A empresa brasileira de PostgreSQL 39 / 39