procergs 2015-03-25: bad smells em bancos de dados

56
Bad Smells (mal cheiros) em Bancos de Dados timbira A empresa brasileira de PostgreSQL PROCERGS - Quarta-feira do conhecimento Porto Alegre, 2015-03-25

Upload: fabrizio-mello

Post on 20-Jul-2015

309 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: PROCERGS 2015-03-25: Bad Smells em Bancos de Dados

Bad Smells (mal cheiros) em Bancos de Dados

timbiraA empresa brasileira de PostgreSQL

PROCERGS - Quarta-feira do conhecimentoPorto Alegre, 2015-03-25

Page 2: PROCERGS 2015-03-25: Bad Smells 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.github.io

• Timbira• Consultor/Mentor/Coach• A empresa brasileira de PostgreSQL• Consultoria• Desenvolvimento• Suporte 24x7• Treinamento

Timbira - A empresa brasileira de PostgreSQL 2 / 42

Page 3: PROCERGS 2015-03-25: Bad Smells em Bancos de Dados

Sobre este material timbira

• esta apresentação está disponível em:http://slideshare.net/fabriziomello

• 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: PROCERGS 2015-03-25: Bad Smells 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 / 42

Page 5: PROCERGS 2015-03-25: Bad Smells 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• ...• 2015 - Taxonomia Smells em BD

Timbira - A empresa brasileira de PostgreSQL 2 / 42

Page 6: PROCERGS 2015-03-25: Bad Smells 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 / 42

Page 7: PROCERGS 2015-03-25: Bad Smells 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 / 42

Page 8: PROCERGS 2015-03-25: Bad Smells 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 / 42

Page 9: PROCERGS 2015-03-25: Bad Smells 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, sabem porque?• além de manter comportamento também é preciso manter

informação (dados);• acoplamento com diversas origens (apps, bds, integrações,

3rd, ...)

Timbira - A empresa brasileira de PostgreSQL 5 / 42

Page 10: PROCERGS 2015-03-25: Bad Smells 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, sabem porque?

• 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 / 42

Page 11: PROCERGS 2015-03-25: Bad Smells 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, sabem porque?• além de manter comportamento também é preciso manter

informação (dados);• acoplamento com diversas origens (apps, bds, integrações,

3rd, ...)

Timbira - A empresa brasileira de PostgreSQL 5 / 42

Page 12: PROCERGS 2015-03-25: Bad Smells 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 / 42

Page 13: PROCERGS 2015-03-25: Bad Smells 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 / 42

Page 14: PROCERGS 2015-03-25: Bad Smells 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 / 42

Page 15: PROCERGS 2015-03-25: Bad Smells em Bancos de Dados

Database Smell timbira

Multi-purpose columnSe uma coluna for utilizada para vários fins, é provável queexista um código extra para garantir que a mesma sejausada corretamente e, muitas vezes, verificando valores deuma ou mais colunas.

Timbira - A empresa brasileira de PostgreSQL 9 / 42

Page 16: PROCERGS 2015-03-25: Bad Smells 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 / 42

Page 17: PROCERGS 2015-03-25: Bad Smells 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 / 42

Page 18: PROCERGS 2015-03-25: Bad Smells em Bancos de Dados

Multi-purpose column timbira

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

Timbira - A empresa brasileira de PostgreSQL 11 / 42

Page 19: PROCERGS 2015-03-25: Bad Smells em Bancos de Dados

Database Smell timbira

Multi-purpose tableQuando uma tabela é utilizada paraarmazenar vários tipos de entidades provavelmente existe umafalha de projeto.

Timbira - A empresa brasileira de PostgreSQL 12 / 42

Page 20: PROCERGS 2015-03-25: Bad Smells em Bancos de Dados

Multi-purpose table timbira

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),data DATE

);

• Se cnpj e nome_fantasia = NULL então NOME = nomepessoa física

• Se cpf e rg = NULL então NOME = razão social

Timbira - A empresa brasileira de PostgreSQL 13 / 42

Page 21: PROCERGS 2015-03-25: Bad Smells em Bancos de Dados

Multi-purpose table timbira

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),data DATE

);

• Se cnpj e nome_fantasia = NULL então NOME = nomepessoa física

• Se cpf e rg = NULL então NOME = razão social

Timbira - A empresa brasileira de PostgreSQL 13 / 42

Page 22: PROCERGS 2015-03-25: Bad Smells em Bancos de Dados

Multi-purpose table timbira

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

Timbira - A empresa brasileira de PostgreSQL 14 / 42

Page 23: PROCERGS 2015-03-25: Bad Smells em Bancos de Dados

Database Smell timbira

Redundant dataÉ um problema sério em bases de dados porque quando odado é armazenado em vários locais, existe risco de ocorrerinconsistência.

Timbira - A empresa brasileira de PostgreSQL 15 / 42

Page 24: PROCERGS 2015-03-25: Bad Smells 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 / 42

Page 25: PROCERGS 2015-03-25: Bad Smells 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 / 42

Page 26: PROCERGS 2015-03-25: Bad Smells em Bancos de Dados

Database Smell timbira

Tables with too many columnsQuando uma tabela tem muitas colunas éindicativo de falta de coesão, pois está armazenando dados devárias entidades.

Timbira - A empresa brasileira de PostgreSQL 18 / 42

Page 27: PROCERGS 2015-03-25: Bad Smells 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 / 42

Page 28: PROCERGS 2015-03-25: Bad Smells 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 / 42

Page 29: PROCERGS 2015-03-25: Bad Smells 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 / 42

Page 30: PROCERGS 2015-03-25: Bad Smells 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 / 42

Page 31: PROCERGS 2015-03-25: Bad Smells em Bancos de Dados

Tables with too many rows timbira

CREATE TABLE log (logtime TIMESTAMP,user_name TEXT,context CHAR(10),message TEXT,detail TEXT

);

CREATE TABLE log_201401() INHERITS (log);CREATE TABLE log_201402() INHERITS (log);...CREATE TABLE log_201503() INHERITS (log);

Timbira - A empresa brasileira de PostgreSQL 23 / 42

Page 32: PROCERGS 2015-03-25: Bad Smells em Bancos de Dados

Tables with too many rows timbira

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

OBS: Em Bancos de Dados Relacionais conhecemos essa técnicacomo ”Particionamento de Tabelas”

Timbira - A empresa brasileira de PostgreSQL 24 / 42

Page 33: PROCERGS 2015-03-25: Bad Smells em Bancos de Dados

Tables with too many rows timbira

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

OBS: Em Bancos de Dados Relacionais conhecemos essa técnicacomo ”Particionamento de Tabelas”

Timbira - A empresa brasileira de PostgreSQL 24 / 42

Page 34: PROCERGS 2015-03-25: Bad Smells em Bancos de Dados

Database Smell timbira

Smart columnsColuna que armazena informações de mais de um contexto(concatenação de informações).

Timbira - A empresa brasileira de PostgreSQL 25 / 42

Page 35: PROCERGS 2015-03-25: Bad Smells 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 / 42

Page 36: PROCERGS 2015-03-25: Bad Smells 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 / 42

Page 37: PROCERGS 2015-03-25: Bad Smells em Bancos de Dados

Smart columns timbira

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

Timbira - A empresa brasileira de PostgreSQL 27 / 42

Page 38: PROCERGS 2015-03-25: Bad Smells 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 / 42

Page 39: PROCERGS 2015-03-25: Bad Smells 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 / 42

Page 40: PROCERGS 2015-03-25: Bad Smells 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 / 42

Page 41: PROCERGS 2015-03-25: Bad Smells 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 / 42

Page 42: PROCERGS 2015-03-25: Bad Smells 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 / 42

Page 43: PROCERGS 2015-03-25: Bad Smells 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”, WTF?

Timbira - A empresa brasileira de PostgreSQL 32 / 42

Page 44: PROCERGS 2015-03-25: Bad Smells 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”, WTF?

Timbira - A empresa brasileira de PostgreSQL 32 / 42

Page 45: PROCERGS 2015-03-25: Bad Smells em Bancos de Dados

Wrong data type timbira

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

Timbira - A empresa brasileira de PostgreSQL 33 / 42

Page 46: PROCERGS 2015-03-25: Bad Smells em Bancos de Dados

Database Smell timbira

Trigger SpaghettiQuando existe uma trigger em uma tabela A que realiza operações(insert/update/delete) em uma tabela B e esta possui trigger que,dependendo de condições (valores das colunas), faz operações natabela C, onde também existe outra trigger, que tambémdependendo de algumas condições faz operações na tabela A, ondede certa forma garante que nao seja gerado um loop infinito.WTF??

Timbira - A empresa brasileira de PostgreSQL 34 / 42

Page 47: PROCERGS 2015-03-25: Bad Smells em Bancos de Dados

Database Smell timbira

Trigger SpaghettiSe você tem isso, saiba que existe um lugarzinho especial reservadopra você ”In the Hell” !!!Sério... NÂO FAÇA ISSO!!!.

Timbira - A empresa brasileira de PostgreSQL 35 / 42

Page 48: PROCERGS 2015-03-25: Bad Smells em Bancos de Dados

Database Smell timbira

Smells detectados pela minha experiência (ainda não estãona literatura):

• Phantom foreign-key• Wrong data type• Trigger Spaghetti

Timbira - A empresa brasileira de PostgreSQL 36 / 42

Page 49: PROCERGS 2015-03-25: Bad Smells 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.

Timbira - A empresa brasileira de PostgreSQL 37 / 42

Page 50: PROCERGS 2015-03-25: Bad Smells 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.

Timbira - A empresa brasileira de PostgreSQL 37 / 42

Page 51: PROCERGS 2015-03-25: Bad Smells em Bancos de Dados

Database Smell timbira

Fear of changeA solução para esse smell é mais uma questão depostura positiva do time aliada a adoção de boas práticas, taiscomo:

• database refactoring;• database unit and regression tests;• database continuous integration;• schema versioning.

Timbira - A empresa brasileira de PostgreSQL 38 / 42

Page 52: PROCERGS 2015-03-25: Bad Smells em Bancos de Dados

Database Smell timbira

Fear of changeA solução para esse smell é mais uma questão depostura positiva do time aliada a adoção de boas práticas, taiscomo:

• database refactoring;• database unit and regression tests;• database continuous integration;• schema versioning.

Timbira - A empresa brasileira de PostgreSQL 38 / 42

Page 53: PROCERGS 2015-03-25: Bad Smells 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 39 / 42

Page 54: PROCERGS 2015-03-25: Bad Smells em Bancos de Dados

Considerações Finais timbira

Á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

Timbira - A empresa brasileira de PostgreSQL 40 / 42

Page 55: PROCERGS 2015-03-25: Bad Smells em Bancos de Dados

Dúvidas timbira

?

Fabrízio de Royes Mello@fabriziomello

[email protected]@gmail.com

http://www.timbira.com.brhttp://slideshare.net/fabriziomello

Timbira - A empresa brasileira de PostgreSQL 41 / 42

Page 56: PROCERGS 2015-03-25: Bad Smells 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 42 / 42