bad smells (mal cheiros) em bancos de dados

48
Bad Smells (mal cheiros) em Bancos de Dados timbira A empresa brasileira de PostgreSQL TDC2013, Porto Alegre, 2013-10-26

Upload: fabrizio-mello

Post on 25-May-2015

519 views

Category:

Documents


18 download

DESCRIPTION

Bad Smells (mal cheiros) em Bancos de Dados

TRANSCRIPT

Page 1: 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

Page 2: Bad Smells (mal cheiros) em Bancos de Dados

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

Page 3: Bad Smells (mal cheiros) em Bancos de Dados

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]

Page 4: Bad Smells (mal cheiros) em Bancos de Dados

Resumo timbira

1 Prelúdio

2 Introdução

3 Bad Smells

4 Considerações Finais

Timbira - A empresa brasileira de PostgreSQL 1 / 39

Page 5: Bad Smells (mal cheiros) em Bancos de Dados

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

Page 6: Bad Smells (mal cheiros) em Bancos de Dados

Resumo timbira

1 Prelúdio

2 Introdução

3 Bad Smells

4 Considerações Finais

Timbira - A empresa brasileira de PostgreSQL 3 / 39

Page 7: Bad Smells (mal cheiros) em Bancos de Dados

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

Page 8: Bad Smells (mal cheiros) em Bancos de Dados

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

Page 9: Bad Smells (mal cheiros) em Bancos de Dados

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

Page 10: Bad Smells (mal cheiros) em Bancos de Dados

Resumo timbira

1 Prelúdio

2 Introdução

3 Bad Smells

4 Considerações Finais

Timbira - A empresa brasileira de PostgreSQL 6 / 39

Page 11: Bad Smells (mal cheiros) em Bancos de Dados

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

Page 12: Bad Smells (mal cheiros) em Bancos de Dados

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

Page 13: Bad Smells (mal cheiros) em Bancos de Dados

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

Page 14: Bad Smells (mal cheiros) em Bancos de Dados

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

Page 15: Bad Smells (mal cheiros) em Bancos de Dados

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

Page 16: Bad Smells (mal cheiros) em Bancos de Dados

Multi-purpose column timbira

Sugestão(ões) Database Refactoring:• Split Column• Move Column

Timbira - A empresa brasileira de PostgreSQL 11 / 39

Page 17: Bad Smells (mal cheiros) em Bancos de Dados

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

Page 18: Bad Smells (mal cheiros) em Bancos de Dados

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

Page 19: Bad Smells (mal cheiros) em Bancos de Dados

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

Page 20: Bad Smells (mal cheiros) em Bancos de Dados

Multi-purpose table timbira

Sugestão(ões) Database Refactoring:• Split Column• Move Column• Split Table

Timbira - A empresa brasileira de PostgreSQL 14 / 39

Page 21: Bad Smells (mal cheiros) em Bancos de Dados

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

Page 22: Bad Smells (mal cheiros) em Bancos de Dados

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

Page 23: Bad Smells (mal cheiros) em Bancos de Dados

Redundant data timbira

Sugestão(ões) Database Refactoring:• Merge Tables• Move Data• Drop Column

Timbira - A empresa brasileira de PostgreSQL 17 / 39

Page 24: Bad Smells (mal cheiros) em Bancos de Dados

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

Page 25: Bad Smells (mal cheiros) em Bancos de Dados

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

Page 26: Bad Smells (mal cheiros) em Bancos de Dados

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

Page 27: Bad Smells (mal cheiros) em Bancos de Dados

Tables with too many columns timbira

Sugestão(ões) Database Refactoring:• Split Table• Move Column

Timbira - A empresa brasileira de PostgreSQL 21 / 39

Page 28: Bad Smells (mal cheiros) em Bancos de Dados

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

Page 29: Bad Smells (mal cheiros) em Bancos de Dados

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

Page 30: Bad Smells (mal cheiros) em Bancos de Dados

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

Page 31: Bad Smells (mal cheiros) em Bancos de Dados

Database Smell timbira

Smart columnsColuna onde em diferentes posições do dado representam conceitosdiferentes.

Timbira - A empresa brasileira de PostgreSQL 25 / 39

Page 32: Bad Smells (mal cheiros) em Bancos de Dados

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

Page 33: Bad Smells (mal cheiros) em Bancos de Dados

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

Page 34: Bad Smells (mal cheiros) em Bancos de Dados

Smart columns timbira

Sugestão(ões) Database Refactoring:• Split Column

Timbira - A empresa brasileira de PostgreSQL 27 / 39

Page 35: Bad Smells (mal cheiros) em Bancos de Dados

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

Page 36: Bad Smells (mal cheiros) em Bancos de Dados

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

Page 37: Bad Smells (mal cheiros) em Bancos de Dados

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

Page 38: Bad Smells (mal cheiros) em Bancos de Dados

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

Page 39: Bad Smells (mal cheiros) em Bancos de Dados

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

Page 40: Bad Smells (mal cheiros) em Bancos de Dados

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

Page 41: Bad Smells (mal cheiros) em Bancos de Dados

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

Page 42: Bad Smells (mal cheiros) em Bancos de Dados

Wrong data type timbira

Sugestão(ões) Database Refactoring:• Replace column

Timbira - A empresa brasileira de PostgreSQL 33 / 39

Page 43: Bad Smells (mal cheiros) em Bancos de Dados

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

Page 44: Bad Smells (mal cheiros) em Bancos de Dados

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

Page 45: Bad Smells (mal cheiros) em Bancos de Dados

Resumo timbira

1 Prelúdio

2 Introdução

3 Bad Smells

4 Considerações Finais

Timbira - A empresa brasileira de PostgreSQL 36 / 39

Page 46: Bad Smells (mal cheiros) em Bancos de Dados

Considerações Finais timbira

• Coragem para evoluir• Taxonomia dos Database Smells• Ferramenta para detecção

Timbira - A empresa brasileira de PostgreSQL 37 / 39

Page 47: Bad Smells (mal cheiros) em Bancos de Dados

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

Page 48: Bad Smells (mal cheiros) em Bancos de Dados

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