SlideShare uma empresa Scribd logo
1 de 48
Baixar para ler offline
Bad Smells (mal cheiros) em Bancos de Dados

timbira

A empresa brasileira de PostgreSQL

TDC2013, Porto Alegre, 2013-10-26
timbira

Palestrante

• 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 Commons

Atribuição 3.0 Brasil:
http://www.creativecommons.org/licenses/by/3.0/br
• Embora este material tenha sido elaborado com toda

precaução, os autores não assumem quaisquer
responsabilidades por erros, omissões ou danos resultantes da
utilização das informações aqui contidas.

• Se você encontrar qualquer erro, por favor reporte-o a

contato@timbira.com.br
timbira

Resumo

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
timbira

Resumo

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.

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 manter

informação (dados);

• acoplamento com diversas origens (apps, bds, integrações,

3rd, ...)

Timbira - A empresa brasileira de PostgreSQL

5 / 39
timbira

Resumo

1 Prelúdio
2 Introdução
3 Bad Smells
4 Considerações Finais

Timbira - A empresa brasileira de PostgreSQL

6 / 39
timbira

Code Smell

É uma categoria comum de problema no código fonte que indica
a necessidade de refatoração. (Martin Fowler)

Timbira - A empresa brasileira de PostgreSQL

7 / 39
Database Smell

timbira

Similarmente aos Code Smells existem problemas comuns em
bancos de dados que indicam uma potencial necessidade de
refatoração. (Scott Ambler)

Timbira - A empresa brasileira de PostgreSQL

8 / 39
Database Smell

timbira

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.

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
);

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 table
Quando uma tabela é utilizada para armazenar vários tipos de
entidades 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
);

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 de
inconsistê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 columns
Quando uma tabela tem muitas colunas é indicativo de falta de
coesã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 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.

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
CREATE
...
CREATE
CREATE
CREATE

TABLE measurement_y2006m02 ( ) INHERITS (measurement
TABLE measurement_y2006m03 ( ) INHERITS (measurement

TABLE measurement_y2007m11 ( ) INHERITS (measurement
TABLE measurement_y2007m12 ( ) INHERITS (measurement
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 columns
Coluna onde em diferentes posições do dado representam conceitos
diferentes.

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
...
);

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-key
Quando uma coluna em uma tabela pode receber um valor que
dependendo de outra coluna estabelece relacionamento de chave
estrangeira com outra tabela.

Timbira - A empresa brasileira de PostgreSQL

28 / 39
Phantom foreign-key

timbira

CREATE TABLE tabela (
...
tipo
INTEGER,
codigo INTEGER,
...
);

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 type
Tipos de dados possuem uma assinatura, que descreve as
validaçõ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
);

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 na
literatura):
• Phantom foreign-key
• Wrong data type
• Trigger Spaghetti

Timbira - A empresa brasileira de PostgreSQL

34 / 39
Database Smell

timbira

Fear of 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.

"Lempre-se do valor Coragem do XP!!!!"

Timbira - A empresa brasileira de PostgreSQL

35 / 39
timbira

Resumo

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
timbira

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

Timbira - A empresa brasileira de PostgreSQL

38 / 39
timbira

Perguntas

?
Fabrízio de Royes Mello
@fabriziomello
fabrizio@timbira.com.br
http://www.timbira.com.br
http://slideshare.net/fabriziomello

Timbira - A empresa brasileira de PostgreSQL

39 / 39

Mais conteúdo relacionado

Destaque

Keep calm and Database Continuous Deployment
Keep calm and Database Continuous DeploymentKeep calm and Database Continuous Deployment
Keep calm and Database Continuous DeploymentFabrízio Mello
 
GSoC2014 - PGDay Ijui/RS Presentation October, 2016
GSoC2014 - PGDay Ijui/RS Presentation October, 2016 GSoC2014 - PGDay Ijui/RS Presentation October, 2016
GSoC2014 - PGDay Ijui/RS Presentation October, 2016 Fabrízio Mello
 
Como posso colaborar com o PostgreSQL
Como posso colaborar com o PostgreSQLComo posso colaborar com o PostgreSQL
Como posso colaborar com o PostgreSQLFabrízio Mello
 
GSoC2014 - PGCon2015 Presentation June, 2015
GSoC2014 - PGCon2015 Presentation June, 2015GSoC2014 - PGCon2015 Presentation June, 2015
GSoC2014 - PGCon2015 Presentation June, 2015Fabrízio Mello
 
EXPLicando o Explain no PostgreSQL
EXPLicando o Explain no PostgreSQLEXPLicando o Explain no PostgreSQL
EXPLicando o Explain no PostgreSQLFabrízio Mello
 
Tutorial Database Refactoring
Tutorial Database RefactoringTutorial Database Refactoring
Tutorial Database RefactoringFabrízio Mello
 
NoSQL + SQL = PostgreSQL (TDC2014 - Porto Alegre/RS)
NoSQL + SQL = PostgreSQL (TDC2014 - Porto Alegre/RS)NoSQL + SQL = PostgreSQL (TDC2014 - Porto Alegre/RS)
NoSQL + SQL = PostgreSQL (TDC2014 - Porto Alegre/RS)Fabrízio Mello
 
Postgres Wonderland - PGDay Cascavél 2013
Postgres Wonderland - PGDay Cascavél 2013Postgres Wonderland - PGDay Cascavél 2013
Postgres Wonderland - PGDay Cascavél 2013Fabio Telles Rodriguez
 
GSoC2014 - Uniritter Presentation May, 2015
GSoC2014 - Uniritter Presentation May, 2015GSoC2014 - Uniritter Presentation May, 2015
GSoC2014 - Uniritter Presentation May, 2015Fabrízio Mello
 
Sharing Code and Experiences
Sharing Code and ExperiencesSharing Code and Experiences
Sharing Code and ExperiencesFabrízio Mello
 
Planejador de Consultas do PostgreSQL
Planejador de Consultas do PostgreSQLPlanejador de Consultas do PostgreSQL
Planejador de Consultas do PostgreSQLFabrízio Mello
 

Destaque (12)

Keep calm and Database Continuous Deployment
Keep calm and Database Continuous DeploymentKeep calm and Database Continuous Deployment
Keep calm and Database Continuous Deployment
 
GSoC2014 - PGDay Ijui/RS Presentation October, 2016
GSoC2014 - PGDay Ijui/RS Presentation October, 2016 GSoC2014 - PGDay Ijui/RS Presentation October, 2016
GSoC2014 - PGDay Ijui/RS Presentation October, 2016
 
Como posso colaborar com o PostgreSQL
Como posso colaborar com o PostgreSQLComo posso colaborar com o PostgreSQL
Como posso colaborar com o PostgreSQL
 
Dojo plpgsql
Dojo plpgsqlDojo plpgsql
Dojo plpgsql
 
GSoC2014 - PGCon2015 Presentation June, 2015
GSoC2014 - PGCon2015 Presentation June, 2015GSoC2014 - PGCon2015 Presentation June, 2015
GSoC2014 - PGCon2015 Presentation June, 2015
 
EXPLicando o Explain no PostgreSQL
EXPLicando o Explain no PostgreSQLEXPLicando o Explain no PostgreSQL
EXPLicando o Explain no PostgreSQL
 
Tutorial Database Refactoring
Tutorial Database RefactoringTutorial Database Refactoring
Tutorial Database Refactoring
 
NoSQL + SQL = PostgreSQL (TDC2014 - Porto Alegre/RS)
NoSQL + SQL = PostgreSQL (TDC2014 - Porto Alegre/RS)NoSQL + SQL = PostgreSQL (TDC2014 - Porto Alegre/RS)
NoSQL + SQL = PostgreSQL (TDC2014 - Porto Alegre/RS)
 
Postgres Wonderland - PGDay Cascavél 2013
Postgres Wonderland - PGDay Cascavél 2013Postgres Wonderland - PGDay Cascavél 2013
Postgres Wonderland - PGDay Cascavél 2013
 
GSoC2014 - Uniritter Presentation May, 2015
GSoC2014 - Uniritter Presentation May, 2015GSoC2014 - Uniritter Presentation May, 2015
GSoC2014 - Uniritter Presentation May, 2015
 
Sharing Code and Experiences
Sharing Code and ExperiencesSharing Code and Experiences
Sharing Code and Experiences
 
Planejador de Consultas do PostgreSQL
Planejador de Consultas do PostgreSQLPlanejador de Consultas do PostgreSQL
Planejador de Consultas do PostgreSQL
 

Semelhante a Bad Smells em Bancos de Dados

NoSQL + SQL = PostgreSQL (PGDay Campinas 2014)
NoSQL + SQL = PostgreSQL (PGDay Campinas 2014)NoSQL + SQL = PostgreSQL (PGDay Campinas 2014)
NoSQL + SQL = PostgreSQL (PGDay Campinas 2014)Fabrízio Mello
 
Big data e PostgreSQL
Big data e PostgreSQLBig data e PostgreSQL
Big data e PostgreSQLEuler Taveira
 
Replicação Lógica no PostgreSQL 10
Replicação Lógica no PostgreSQL 10Replicação Lógica no PostgreSQL 10
Replicação Lógica no PostgreSQL 10Euler Taveira
 
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
 
LINQ - Language Integrated Query
LINQ - Language Integrated QueryLINQ - Language Integrated Query
LINQ - Language Integrated QueryDalton Valadares
 
Net Coders Ladies - Introdução a Banco de Dados
Net Coders Ladies - Introdução a Banco de Dados Net Coders Ladies - Introdução a Banco de Dados
Net Coders Ladies - Introdução a Banco de Dados Aline Lavorato
 
Aula_05_-_Listas_Duplamente_Encadeadas_opp.ppt
Aula_05_-_Listas_Duplamente_Encadeadas_opp.pptAula_05_-_Listas_Duplamente_Encadeadas_opp.ppt
Aula_05_-_Listas_Duplamente_Encadeadas_opp.pptssuserd654cb1
 
Desmistificando Replicação no PostgreSQL
Desmistificando Replicação no PostgreSQLDesmistificando Replicação no PostgreSQL
Desmistificando Replicação no PostgreSQLEuler Taveira
 
Linguagem SQL (com MySQL)
Linguagem SQL (com MySQL)Linguagem SQL (com MySQL)
Linguagem SQL (com MySQL)Marco Pinheiro
 
Banco dados lj
Banco dados ljBanco dados lj
Banco dados ljCarol Luz
 
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
 

Semelhante a Bad Smells em Bancos de Dados (17)

NoSQL + SQL = PostgreSQL (PGDay Campinas 2014)
NoSQL + SQL = PostgreSQL (PGDay Campinas 2014)NoSQL + SQL = PostgreSQL (PGDay Campinas 2014)
NoSQL + SQL = PostgreSQL (PGDay Campinas 2014)
 
Big data e PostgreSQL
Big data e PostgreSQLBig data e PostgreSQL
Big data e PostgreSQL
 
Replicação Lógica no PostgreSQL 10
Replicação Lógica no PostgreSQL 10Replicação Lógica no PostgreSQL 10
Replicação Lógica no PostgreSQL 10
 
KrahoDB
KrahoDBKrahoDB
KrahoDB
 
Pgquarrel
PgquarrelPgquarrel
Pgquarrel
 
Postgres Big data
Postgres Big dataPostgres Big data
Postgres Big data
 
Postgres Tuning
Postgres TuningPostgres Tuning
Postgres Tuning
 
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
 
LINQ - Language Integrated Query
LINQ - Language Integrated QueryLINQ - Language Integrated Query
LINQ - Language Integrated Query
 
Net Coders Ladies - Introdução a Banco de Dados
Net Coders Ladies - Introdução a Banco de Dados Net Coders Ladies - Introdução a Banco de Dados
Net Coders Ladies - Introdução a Banco de Dados
 
Aula_05_-_Listas_Duplamente_Encadeadas_opp.ppt
Aula_05_-_Listas_Duplamente_Encadeadas_opp.pptAula_05_-_Listas_Duplamente_Encadeadas_opp.ppt
Aula_05_-_Listas_Duplamente_Encadeadas_opp.ppt
 
Desmistificando Replicação no PostgreSQL
Desmistificando Replicação no PostgreSQLDesmistificando Replicação no PostgreSQL
Desmistificando Replicação no PostgreSQL
 
Linguagem SQL (com MySQL)
Linguagem SQL (com MySQL)Linguagem SQL (com MySQL)
Linguagem SQL (com MySQL)
 
Aprofundamento de DDL e DML
Aprofundamento de DDL e DMLAprofundamento de DDL e DML
Aprofundamento de DDL e DML
 
Banco dados lj
Banco dados ljBanco dados lj
Banco dados lj
 
AULA-02.pdf
AULA-02.pdfAULA-02.pdf
AULA-02.pdf
 
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
 

Mais de Fabrízio Mello

PHP e PostgreSQL: Um é pouco, dois é bom, três é demais
PHP e PostgreSQL: Um é pouco, dois é bom, três é demaisPHP e PostgreSQL: Um é pouco, dois é bom, três é demais
PHP e PostgreSQL: Um é pouco, dois é bom, três é demaisFabrízio Mello
 
URCAMP (Jun2017) - Como o papel e atividades de DBA ficam no contexto da cult...
URCAMP (Jun2017) - Como o papel e atividades de DBA ficam no contexto da cult...URCAMP (Jun2017) - Como o papel e atividades de DBA ficam no contexto da cult...
URCAMP (Jun2017) - Como o papel e atividades de DBA ficam no contexto da cult...Fabrízio Mello
 
DBA Brasil 2.0: Como o papel e atividades de DBA ficam no contexto da cultura...
DBA Brasil 2.0: Como o papel e atividades de DBA ficam no contexto da cultura...DBA Brasil 2.0: Como o papel e atividades de DBA ficam no contexto da cultura...
DBA Brasil 2.0: Como o papel e atividades de DBA ficam no contexto da cultura...Fabrízio Mello
 
Software Delivery Like a Boss
Software Delivery Like a BossSoftware Delivery Like a Boss
Software Delivery Like a BossFabrízio Mello
 
Oficina PostgreSQL Básico Latinoware 2012
Oficina PostgreSQL Básico Latinoware 2012Oficina PostgreSQL Básico Latinoware 2012
Oficina PostgreSQL Básico Latinoware 2012Fabrízio Mello
 
Oficina postgresql avançado_consegi2010
Oficina postgresql avançado_consegi2010Oficina postgresql avançado_consegi2010
Oficina postgresql avançado_consegi2010Fabrízio Mello
 
Oficina postgresql basico_consegi2010
Oficina postgresql basico_consegi2010Oficina postgresql basico_consegi2010
Oficina postgresql basico_consegi2010Fabrízio Mello
 
Database refactoring postgresql_consegi2010
Database refactoring postgresql_consegi2010Database refactoring postgresql_consegi2010
Database refactoring postgresql_consegi2010Fabrízio Mello
 
Database Refactoring PostgreSQL Urcamp Alegrete 2009
Database Refactoring PostgreSQL Urcamp Alegrete 2009Database Refactoring PostgreSQL Urcamp Alegrete 2009
Database Refactoring PostgreSQL Urcamp Alegrete 2009Fabrízio Mello
 
Database Refactoring com PostgreSQL PGDay RS 2009
Database Refactoring com PostgreSQL PGDay RS 2009Database Refactoring com PostgreSQL PGDay RS 2009
Database Refactoring com PostgreSQL PGDay RS 2009Fabrízio Mello
 
Refatoração Banco de Dados (Agileweekend2009)
Refatoração Banco de Dados (Agileweekend2009)Refatoração Banco de Dados (Agileweekend2009)
Refatoração Banco de Dados (Agileweekend2009)Fabrízio Mello
 

Mais de Fabrízio Mello (11)

PHP e PostgreSQL: Um é pouco, dois é bom, três é demais
PHP e PostgreSQL: Um é pouco, dois é bom, três é demaisPHP e PostgreSQL: Um é pouco, dois é bom, três é demais
PHP e PostgreSQL: Um é pouco, dois é bom, três é demais
 
URCAMP (Jun2017) - Como o papel e atividades de DBA ficam no contexto da cult...
URCAMP (Jun2017) - Como o papel e atividades de DBA ficam no contexto da cult...URCAMP (Jun2017) - Como o papel e atividades de DBA ficam no contexto da cult...
URCAMP (Jun2017) - Como o papel e atividades de DBA ficam no contexto da cult...
 
DBA Brasil 2.0: Como o papel e atividades de DBA ficam no contexto da cultura...
DBA Brasil 2.0: Como o papel e atividades de DBA ficam no contexto da cultura...DBA Brasil 2.0: Como o papel e atividades de DBA ficam no contexto da cultura...
DBA Brasil 2.0: Como o papel e atividades de DBA ficam no contexto da cultura...
 
Software Delivery Like a Boss
Software Delivery Like a BossSoftware Delivery Like a Boss
Software Delivery Like a Boss
 
Oficina PostgreSQL Básico Latinoware 2012
Oficina PostgreSQL Básico Latinoware 2012Oficina PostgreSQL Básico Latinoware 2012
Oficina PostgreSQL Básico Latinoware 2012
 
Oficina postgresql avançado_consegi2010
Oficina postgresql avançado_consegi2010Oficina postgresql avançado_consegi2010
Oficina postgresql avançado_consegi2010
 
Oficina postgresql basico_consegi2010
Oficina postgresql basico_consegi2010Oficina postgresql basico_consegi2010
Oficina postgresql basico_consegi2010
 
Database refactoring postgresql_consegi2010
Database refactoring postgresql_consegi2010Database refactoring postgresql_consegi2010
Database refactoring postgresql_consegi2010
 
Database Refactoring PostgreSQL Urcamp Alegrete 2009
Database Refactoring PostgreSQL Urcamp Alegrete 2009Database Refactoring PostgreSQL Urcamp Alegrete 2009
Database Refactoring PostgreSQL Urcamp Alegrete 2009
 
Database Refactoring com PostgreSQL PGDay RS 2009
Database Refactoring com PostgreSQL PGDay RS 2009Database Refactoring com PostgreSQL PGDay RS 2009
Database Refactoring com PostgreSQL PGDay RS 2009
 
Refatoração Banco de Dados (Agileweekend2009)
Refatoração Banco de Dados (Agileweekend2009)Refatoração Banco de Dados (Agileweekend2009)
Refatoração Banco de Dados (Agileweekend2009)
 

Bad Smells em Bancos de Dados

  • 1. Bad Smells (mal cheiros) em Bancos de Dados timbira A empresa brasileira de PostgreSQL TDC2013, Porto Alegre, 2013-10-26
  • 2. timbira Palestrante • 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
  • 3. 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 Commons Atribuição 3.0 Brasil: http://www.creativecommons.org/licenses/by/3.0/br • Embora este material tenha sido elaborado com toda precaução, os autores não assumem quaisquer responsabilidades por erros, omissões ou danos resultantes da utilização das informações aqui contidas. • Se você encontrar qualquer erro, por favor reporte-o a contato@timbira.com.br
  • 4. timbira Resumo 1 Prelúdio 2 Introdução 3 Bad Smells 4 Considerações Finais Timbira - A empresa brasileira de PostgreSQL 1 / 39
  • 5. 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
  • 6. timbira Resumo 1 Prelúdio 2 Introdução 3 Bad Smells 4 Considerações Finais Timbira - A empresa brasileira de PostgreSQL 3 / 39
  • 7. 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
  • 8. Refatoração em Bancos de Dados timbira Deterioração + Mudanças em Requisitos = Necessidade de Refatoração. Timbira - A empresa brasileira de PostgreSQL 5 / 39
  • 9. 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 manter informação (dados); • acoplamento com diversas origens (apps, bds, integrações, 3rd, ...) Timbira - A empresa brasileira de PostgreSQL 5 / 39
  • 10. timbira Resumo 1 Prelúdio 2 Introdução 3 Bad Smells 4 Considerações Finais Timbira - A empresa brasileira de PostgreSQL 6 / 39
  • 11. timbira Code Smell É uma categoria comum de problema no código fonte que indica a necessidade de refatoração. (Martin Fowler) Timbira - A empresa brasileira de PostgreSQL 7 / 39
  • 12. Database Smell timbira Similarmente aos Code Smells existem problemas comuns em bancos de dados que indicam uma potencial necessidade de refatoração. (Scott Ambler) Timbira - A empresa brasileira de PostgreSQL 8 / 39
  • 13. Database Smell timbira 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. Timbira - A empresa brasileira de PostgreSQL 9 / 39
  • 14. 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 ); Timbira - A empresa brasileira de PostgreSQL 10 / 39
  • 15. 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
  • 16. Multi-purpose column timbira Sugestão(ões) Database Refactoring: • Split Column • Move Column Timbira - A empresa brasileira de PostgreSQL 11 / 39
  • 17. Database Smell timbira Multi-purpose table Quando uma tabela é utilizada para armazenar vários tipos de entidades provavelmente existe uma falha de projeto. Timbira - A empresa brasileira de PostgreSQL 12 / 39
  • 18. 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 ); Timbira - A empresa brasileira de PostgreSQL 13 / 39
  • 19. 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
  • 20. Multi-purpose table timbira Sugestão(ões) Database Refactoring: • Split Column • Move Column • Split Table Timbira - A empresa brasileira de PostgreSQL 14 / 39
  • 21. 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 de inconsistência. Timbira - A empresa brasileira de PostgreSQL 15 / 39
  • 22. 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
  • 23. Redundant data timbira Sugestão(ões) Database Refactoring: • Merge Tables • Move Data • Drop Column Timbira - A empresa brasileira de PostgreSQL 17 / 39
  • 24. Database Smell timbira 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. Timbira - A empresa brasileira de PostgreSQL 18 / 39
  • 25. 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
  • 26. 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
  • 27. Tables with too many columns timbira Sugestão(ões) Database Refactoring: • Split Table • Move Column Timbira - A empresa brasileira de PostgreSQL 21 / 39
  • 28. Database Smell timbira 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. Timbira - A empresa brasileira de PostgreSQL 22 / 39
  • 29. Tables with too many rows timbira CREATE TABLE measurement ( city_id int not null, logdate date not null, peaktemp int, unitsales int ); CREATE CREATE ... CREATE CREATE CREATE TABLE measurement_y2006m02 ( ) INHERITS (measurement TABLE measurement_y2006m03 ( ) INHERITS (measurement TABLE measurement_y2007m11 ( ) INHERITS (measurement TABLE measurement_y2007m12 ( ) INHERITS (measurement TABLE measurement_y2008m01 ( ) INHERITS (measurement Timbira - A empresa brasileira de PostgreSQL 23 / 39
  • 30. 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
  • 31. Database Smell timbira Smart columns Coluna onde em diferentes posições do dado representam conceitos diferentes. Timbira - A empresa brasileira de PostgreSQL 25 / 39
  • 32. Smart columns timbira CREATE TABLE processo ( numero CHAR(10) PRIMARY KEY, ... ); CREATE TABLE debito ( processamento CHAR(15) PRIMARY KEY ... ); Timbira - A empresa brasileira de PostgreSQL 26 / 39
  • 33. 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
  • 34. Smart columns timbira Sugestão(ões) Database Refactoring: • Split Column Timbira - A empresa brasileira de PostgreSQL 27 / 39
  • 35. Database Smell timbira 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. Timbira - A empresa brasileira de PostgreSQL 28 / 39
  • 36. Phantom foreign-key timbira CREATE TABLE tabela ( ... tipo INTEGER, codigo INTEGER, ... ); Timbira - A empresa brasileira de PostgreSQL 29 / 39
  • 37. 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
  • 38. 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
  • 39. Database Smell timbira Wrong data type Tipos de dados possuem uma assinatura, que descreve as validações mínimas para seu uso. Timbira - A empresa brasileira de PostgreSQL 31 / 39
  • 40. 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 ); Timbira - A empresa brasileira de PostgreSQL 32 / 39
  • 41. 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
  • 42. Wrong data type timbira Sugestão(ões) Database Refactoring: • Replace column Timbira - A empresa brasileira de PostgreSQL 33 / 39
  • 43. Database Smell timbira Smells detectados pela minha experiência (não estão na literatura): • Phantom foreign-key • Wrong data type • Trigger Spaghetti Timbira - A empresa brasileira de PostgreSQL 34 / 39
  • 44. Database Smell timbira Fear of 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. "Lempre-se do valor Coragem do XP!!!!" Timbira - A empresa brasileira de PostgreSQL 35 / 39
  • 45. timbira Resumo 1 Prelúdio 2 Introdução 3 Bad Smells 4 Considerações Finais Timbira - A empresa brasileira de PostgreSQL 36 / 39
  • 46. Considerações Finais timbira • Coragem para evoluir • Taxonomia dos Database Smells • Ferramenta para detecção Timbira - A empresa brasileira de PostgreSQL 37 / 39
  • 47. timbira 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 Timbira - A empresa brasileira de PostgreSQL 38 / 39
  • 48. timbira Perguntas ? Fabrízio de Royes Mello @fabriziomello fabrizio@timbira.com.br http://www.timbira.com.br http://slideshare.net/fabriziomello Timbira - A empresa brasileira de PostgreSQL 39 / 39