bad smells (mal cheiros) em bancos de dados

Post on 25-May-2015

519 Views

Category:

Documents

18 Downloads

Preview:

Click to see full reader

DESCRIPTION

Bad Smells (mal cheiros) em Bancos de Dados

TRANSCRIPT

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 acontato@timbira.com.br

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

fabrizio@timbira.com.brhttp://www.timbira.com.br

http://slideshare.net/fabriziomello

Timbira - A empresa brasileira de PostgreSQL 39 / 39

top related