SlideShare ist ein Scribd-Unternehmen logo
1 von 59
Downloaden Sie, um offline zu lesen
Bad Smells (mal cheiros) em Bancos de Dados
timbira
A empresa brasileira de PostgreSQL
SAADS, IFSul, Bagé/RS, 2017-10-20
Palestrante timbira
• Fabrízio de Royes Mello
• Desenvolvedor PostgreSQL
• Líder do PostgreSQL Brasil
• Pós-Graduado 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 / 48
Background timbira
Timbira - A empresa brasileira de PostgreSQL 3 / 48
Resumo timbira
1 Introdução
2 Bad Smells
3 Considerações Finais
Timbira - A empresa brasileira de PostgreSQL 4 / 48
Software Quality Assurance timbira
”Consiste em uma forma de monitorar os Processos e Métodos de
Engenharia de Software utilizados afim de garantir Qualidade.”
(Wikipedia)
Timbira - A empresa brasileira de PostgreSQL 5 / 48
Quem não quer um selo destes ?? timbira
Timbira - A empresa brasileira de PostgreSQL 6 / 48
Ou talvez um destes ... timbira
Timbira - A empresa brasileira de PostgreSQL 7 / 48
Melhoria timbira
Timbira - A empresa brasileira de PostgreSQL 8 / 48
Mas e o Banco de Dados????
Timbira - A empresa brasileira de PostgreSQL 9 / 48
Bancos de Dados timbira
Tendem a se deteriorar ao longo do tempo. Alguns motivos:
Timbira - A empresa brasileira de PostgreSQL 10 / 48
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 10 / 48
Refatoração em Bancos de Dados timbira
Deterioração + Mudanças em Requisitos =
Necessidade de Refatoração.
Timbira - A empresa brasileira de PostgreSQL 11 / 48
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?
Timbira - A empresa brasileira de PostgreSQL 11 / 48
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 11 / 48
Resumo timbira
1 Introdução
2 Bad Smells
3 Considerações Finais
Timbira - A empresa brasileira de PostgreSQL 12 / 48
Code Smell timbira
É uma categoria comum de problema no código fonte que indica
a necessidade de refatoração. (Martin Fowler)
Timbira - A empresa brasileira de PostgreSQL 13 / 48
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 14 / 48
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 15 / 48
Multi-purpose column timbira
^^I^^ICREATE TABLE pessoa (
^^I^^I id SERIAL PRIMARY KEY,
^^I^^I tipo CHAR(1) CHECK (tipo IN ('F', 'J')),
^^I^^I nome VARCHAR(100) NOT NULL,
^^I^^I data DATE
^^I^^I);
^^I
Timbira - A empresa brasileira de PostgreSQL 16 / 48
Multi-purpose column timbira
^^I^^ICREATE TABLE pessoa (
^^I^^I id SERIAL PRIMARY KEY,
^^I^^I tipo CHAR(1) CHECK (tipo IN ('F', 'J')),
^^I^^I nome VARCHAR(100) NOT NULL,
^^I^^I data DATE
^^I^^I);
^^I
• Se tipo = ’F’ então DATA = nascimento
• Se tipo = ’J’ então DATA = inicio atividades
Timbira - A empresa brasileira de PostgreSQL 16 / 48
Multi-purpose column timbira
Sugestão(ões) Database Refactoring:
• Split Column
• Move Column
Timbira - A empresa brasileira de PostgreSQL 17 / 48
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 18 / 48
Multi-purpose table timbira
^^I^^ICREATE TABLE pessoa (
^^I^^I id SERIAL PRIMARY KEY,
^^I^^I nome VARCHAR(100) NOT NULL,
^^I^^I nome_fantasia VARCHAR(100),
^^I^^I cnpj CHAR(14),
^^I^^I cpf CHAR(11),
^^I^^I rg CHAR(10),
^^I^^I data DATE
^^I^^I);
^^I
Timbira - A empresa brasileira de PostgreSQL 19 / 48
Multi-purpose table timbira
^^I^^ICREATE TABLE pessoa (
^^I^^I id SERIAL PRIMARY KEY,
^^I^^I nome VARCHAR(100) NOT NULL,
^^I^^I nome_fantasia VARCHAR(100),
^^I^^I cnpj CHAR(14),
^^I^^I cpf CHAR(11),
^^I^^I rg CHAR(10),
^^I^^I data DATE
^^I^^I);
^^I
• Se cnpj e nome_fantasia = NULL então NOME = nome
pessoa física
• Se cpf e rg = NULL então NOME = razão social
Timbira - A empresa brasileira de PostgreSQL 19 / 48
Multi-purpose table timbira
Sugestão(ões) Database Refactoring:
• Move Column
• Split Table
Timbira - A empresa brasileira de PostgreSQL 20 / 48
Database Smell timbira
Redundant data
É um problema sério em bases de dados porque quando o
dado é armazenado em vários locais, existe risco de ocorrer
inconsistência.
Timbira - A empresa brasileira de PostgreSQL 21 / 48
Redundant data timbira
^^I^^ICREATE TABLE sys.usuario (
^^I^^I id SERIAL PRIMARY KEY,
^^I^^I nome VARCHAR(100) NOT NULL,
^^I^^I endereco VARCHAR(100),
^^I^^I numero INTEGER,
^^I^^I complemento VARCHAR(40)
^^I^^I);
^^I^^ICREATE TABLE rh.funcionario (
^^I^^I id SERIAL PRIMARY KEY,
^^I^^I nome VARCHAR(100) NOT NULL,
^^I^^I endereco VARCHAR(100),
^^I^^I numero INTEGER,
^^I^^I complemento VARCHAR(40)
^^I^^I);
^^I
Timbira - A empresa brasileira de PostgreSQL 22 / 48
Redundant data timbira
Sugestão(ões) Database Refactoring:
• Merge Tables
• Move Data
• Drop Column
Timbira - A empresa brasileira de PostgreSQL 23 / 48
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 24 / 48
Tables with too many columns timbira
^^I^^ICREATE TABLE pessoa (
^^I^^I id SERIAL PRIMARY KEY,
^^I^^I nome VARCHAR(100) NOT NULL,
^^I^^I end_entrega VARCHAR(200),
^^I^^I end_cobranca VARCHAR(200),
^^I^^I end_residenc VARCHAR(200),
^^I^^I end_profiss VARCHAR(200),
^^I^^I fone_celular VARCHAR(20),
^^I^^I fone_casa VARCHAR(20),
^^I^^I fone_fax VARCHAR(20),
^^I^^I fone_contato VARCHAR(20)
^^I^^I);
^^I
Timbira - A empresa brasileira de PostgreSQL 25 / 48
Tables with too many columns timbira
^^I^^ICREATE TABLE parametro (
^^I^^I parametro1 VARCHAR(100),
^^I^^I parametro2 VARCHAR(100),
^^I^^I parametro3 VARCHAR(100),
^^I^^I parametro4 VARCHAR(100),
^^I^^I parametro5 VARCHAR(100),
^^I^^I parametro6 VARCHAR(100),
^^I^^I ...
^^I^^I parametroN VARCHAR(100)
^^I^^I);
^^I
Timbira - A empresa brasileira de PostgreSQL 26 / 48
Tables with too many columns timbira
Sugestão(ões) Database Refactoring:
• Split Table
• Move Column
Timbira - A empresa brasileira de PostgreSQL 27 / 48
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 28 / 48
Tables with too many rows timbira
^^ICREATE TABLE log (
^^I logtime TIMESTAMP,
^^I user_name TEXT,
^^I context CHAR(10),
^^I message TEXT,
^^I detail TEXT
^^I);
^^ICREATE TABLE log_201401() INHERITS (log);
^^ICREATE TABLE log_201402() INHERITS (log);
^^I...
^^ICREATE TABLE log_201503() INHERITS (log);
^^I
Timbira - A empresa brasileira de PostgreSQL 29 / 48
Tables with too many rows timbira
Sugestão(ões) Database Refactoring:
• Split Table
• Move Rows
• Move Column
Timbira - A empresa brasileira de PostgreSQL 30 / 48
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écnica
como ”Particionamento de Tabelas”
Timbira - A empresa brasileira de PostgreSQL 30 / 48
Database Smell timbira
Smart columns
Coluna que armazena informações de mais de um contexto
(concatenação de informações).
Timbira - A empresa brasileira de PostgreSQL 31 / 48
Smart columns timbira
^^I^^ICREATE TABLE processo (
^^I^^I numero CHAR(10) PRIMARY KEY,
^^I^^I ...
^^I^^I);
^^I^^ICREATE TABLE debito (
^^I^^I processamento CHAR(15) PRIMARY KEY
^^I^^I ...
^^I^^I);
^^I
Timbira - A empresa brasileira de PostgreSQL 32 / 48
Smart columns timbira
^^I^^ICREATE TABLE processo (
^^I^^I numero CHAR(10) PRIMARY KEY,
^^I^^I ...
^^I^^I);
^^I^^ICREATE TABLE debito (
^^I^^I processamento CHAR(15) PRIMARY KEY
^^I^^I ...
^^I^^I);
^^I
• 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 32 / 48
Smart columns timbira
Sugestão(ões) Database Refactoring:
• Split Column
Timbira - A empresa brasileira de PostgreSQL 33 / 48
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 34 / 48
Phantom foreign-key timbira
^^I^^ICREATE TABLE tabela (
^^I^^I ...
^^I^^I tipo INTEGER,
^^I^^I codigo INTEGER,
^^I^^I ...
^^I^^I);
^^I
Timbira - A empresa brasileira de PostgreSQL 35 / 48
Phantom foreign-key timbira
^^I^^ICREATE TABLE tabela (
^^I^^I ...
^^I^^I tipo INTEGER,
^^I^^I codigo INTEGER,
^^I^^I ...
^^I^^I);
^^I
• 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 35 / 48
Phantom foreign-key timbira
Sugestão(ões) Database Refactoring:
• Introduce new table
• Introduce table constraint
• Move Column
Timbira - A empresa brasileira de PostgreSQL 36 / 48
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 37 / 48
Wrong data type timbira
^^I^^ICREATE TABLE pessoa (
^^I^^I id SERIAL PRIMARY KEY,
^^I^^I nome VARCHAR(100) NOT NULL,
^^I^^I cnpj CHAR(14),
^^I^^I cpf CHAR(11),
^^I^^I rg CHAR(10)
^^I^^I);
^^I^^ICREATE TABLE atributo_dinamico (
^^I^^I nome VARCHAR(100),
^^I^^I tipo INTEGER,
^^I^^I valor TEXT
^^I^^I);
^^I
Timbira - A empresa brasileira de PostgreSQL 38 / 48
Wrong data type timbira
^^I^^ICREATE TABLE pessoa (
^^I^^I id SERIAL PRIMARY KEY,
^^I^^I nome VARCHAR(100) NOT NULL,
^^I^^I cnpj CHAR(14),
^^I^^I cpf CHAR(11),
^^I^^I rg CHAR(10)
^^I^^I);
^^I^^ICREATE TABLE atributo_dinamico (
^^I^^I nome VARCHAR(100),
^^I^^I tipo INTEGER,
^^I^^I valor TEXT
^^I^^I);
^^I
• CNPJ, CPF e RG não são números?
• VALOR é um campo ”flex”, WTF?
Timbira - A empresa brasileira de PostgreSQL 38 / 48
Wrong data type timbira
Sugestão(ões) Database Refactoring:
• Replace column
Timbira - A empresa brasileira de PostgreSQL 39 / 48
Database Smell timbira
Trigger Spaghetti
Quando 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 na
tabela C, onde também existe outra trigger, que também
dependendo de algumas condições faz operações na tabela A, onde
de certa forma garante que nao seja gerado um loop infinito.
WTF??
Timbira - A empresa brasileira de PostgreSQL 40 / 48
Database Smell timbira
Trigger Spaghetti
Se você tem isso, saiba que existe um lugarzinho especial reservado
pra você ”In the Hell” !!!
Sério... NÂO FAÇA ISSO!!!.
Timbira - A empresa brasileira de PostgreSQL 41 / 48
Database Smell timbira
Smells detectados pela minha experiência (ainda não estão
na literatura):
• Phantom foreign-key
• Wrong data type
• Trigger Spaghetti
Timbira - A empresa brasileira de PostgreSQL 42 / 48
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:
Timbira - A empresa brasileira de PostgreSQL 43 / 48
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.
Timbira - A empresa brasileira de PostgreSQL 43 / 48
Database Smell timbira
Fear of change
A solução para esse smell é mais uma questão de
postura positiva do time aliada a adoção de boas práticas, tais
como:
Timbira - A empresa brasileira de PostgreSQL 44 / 48
Database Smell timbira
Fear of change
A solução para esse smell é mais uma questão de
postura positiva do time aliada a adoção de boas práticas, tais
como:
• database refactoring;
• database unit and regression tests;
• database continuous integration;
• schema versioning.
Timbira - A empresa brasileira de PostgreSQL 44 / 48
Resumo timbira
1 Introdução
2 Bad Smells
3 Considerações Finais
Timbira - A empresa brasileira de PostgreSQL 45 / 48
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 46 / 48
Dúvidas timbira
?
Fabrízio de Royes Mello
@fabriziomello
fabrizio@timbira.com.br
fabriziomello@gmail.com
http://www.timbira.com.br
http://slideshare.net/fabriziomello
Timbira - A empresa brasileira de PostgreSQL 47 / 48
Referências timbira
• 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 48 / 48

Weitere ähnliche Inhalte

Ähnlich wie Bad Smells (mal cheiros) em Bancos de Dados

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
 
NoSQL + SQL = PostgreSQL (DBA Brasil 1.0 - São Paulo/SP)
NoSQL + SQL = PostgreSQL (DBA Brasil 1.0 - São Paulo/SP) NoSQL + SQL = PostgreSQL (DBA Brasil 1.0 - São Paulo/SP)
NoSQL + SQL = PostgreSQL (DBA Brasil 1.0 - São Paulo/SP) Fabrízio Mello
 
Bad Smells em Bancos de Dados
Bad Smells em Bancos de DadosBad Smells em Bancos de Dados
Bad Smells em Bancos de DadosFabrízio Mello
 
Big data e PostgreSQL
Big data e PostgreSQLBig data e PostgreSQL
Big data e PostgreSQLEuler Taveira
 
[Agile brazil2014] Bad Smells em Bancos de Dados
[Agile brazil2014] Bad Smells em Bancos de Dados[Agile brazil2014] Bad Smells em Bancos de Dados
[Agile brazil2014] Bad Smells em Bancos de DadosWildtech
 
LINQ - Language Integrated Query
LINQ - Language Integrated QueryLINQ - Language Integrated Query
LINQ - Language Integrated QueryDalton Valadares
 
Tutorial session
Tutorial sessionTutorial session
Tutorial sessionbcoverston
 
Html5css3 dozeroedojeitocerto-130520201244-phpapp02
Html5css3 dozeroedojeitocerto-130520201244-phpapp02Html5css3 dozeroedojeitocerto-130520201244-phpapp02
Html5css3 dozeroedojeitocerto-130520201244-phpapp02Bruno da Silva
 
BD I - Aula 15 B - Criacao de tabelas
BD I - Aula 15 B - Criacao de tabelasBD I - Aula 15 B - Criacao de tabelas
BD I - Aula 15 B - Criacao de tabelasRodrigo Kiyoshi Saito
 
LabMM4 (T17 - 12/13)
LabMM4 (T17 - 12/13)LabMM4 (T17 - 12/13)
LabMM4 (T17 - 12/13)Carlos Santos
 
Aula_01_-_Pilhas_e_Filas_com_Vetores.ppt
Aula_01_-_Pilhas_e_Filas_com_Vetores.pptAula_01_-_Pilhas_e_Filas_com_Vetores.ppt
Aula_01_-_Pilhas_e_Filas_com_Vetores.pptssuserd654cb1
 
Desmistificando Replicação no PostgreSQL
Desmistificando Replicação no PostgreSQLDesmistificando Replicação no PostgreSQL
Desmistificando Replicação no PostgreSQLEuler Taveira
 
Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)
Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)
Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)Dickson S. Guedes
 
PostgreSQL-Prático.pdf
PostgreSQL-Prático.pdfPostgreSQL-Prático.pdf
PostgreSQL-Prático.pdfArleiEvaristo
 
Database Class - Pontos de defasagem e questões de brinde.
Database Class - Pontos de defasagem e questões de brinde.Database Class - Pontos de defasagem e questões de brinde.
Database Class - Pontos de defasagem e questões de brinde.Jann Claude Mousquer
 
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
 

Ähnlich wie Bad Smells (mal cheiros) em Bancos de Dados (20)

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)
 
NoSQL + SQL = PostgreSQL (DBA Brasil 1.0 - São Paulo/SP)
NoSQL + SQL = PostgreSQL (DBA Brasil 1.0 - São Paulo/SP) NoSQL + SQL = PostgreSQL (DBA Brasil 1.0 - São Paulo/SP)
NoSQL + SQL = PostgreSQL (DBA Brasil 1.0 - São Paulo/SP)
 
Bad Smells em Bancos de Dados
Bad Smells em Bancos de DadosBad Smells em Bancos de Dados
Bad Smells em Bancos de Dados
 
Big data e PostgreSQL
Big data e PostgreSQLBig data e PostgreSQL
Big data e PostgreSQL
 
[Agile brazil2014] Bad Smells em Bancos de Dados
[Agile brazil2014] Bad Smells em Bancos de Dados[Agile brazil2014] Bad Smells em Bancos de Dados
[Agile brazil2014] Bad Smells em Bancos de Dados
 
Pgquarrel
PgquarrelPgquarrel
Pgquarrel
 
LINQ - Language Integrated Query
LINQ - Language Integrated QueryLINQ - Language Integrated Query
LINQ - Language Integrated Query
 
Tutorial session
Tutorial sessionTutorial session
Tutorial session
 
Html5css3 dozeroedojeitocerto-130520201244-phpapp02
Html5css3 dozeroedojeitocerto-130520201244-phpapp02Html5css3 dozeroedojeitocerto-130520201244-phpapp02
Html5css3 dozeroedojeitocerto-130520201244-phpapp02
 
BD I - Aula 15 B - Criacao de tabelas
BD I - Aula 15 B - Criacao de tabelasBD I - Aula 15 B - Criacao de tabelas
BD I - Aula 15 B - Criacao de tabelas
 
KrahoDB
KrahoDBKrahoDB
KrahoDB
 
LabMM4 (T17 - 12/13)
LabMM4 (T17 - 12/13)LabMM4 (T17 - 12/13)
LabMM4 (T17 - 12/13)
 
Aula_01_-_Pilhas_e_Filas_com_Vetores.ppt
Aula_01_-_Pilhas_e_Filas_com_Vetores.pptAula_01_-_Pilhas_e_Filas_com_Vetores.ppt
Aula_01_-_Pilhas_e_Filas_com_Vetores.ppt
 
Apostila Oracle
Apostila OracleApostila Oracle
Apostila Oracle
 
Desmistificando Replicação no PostgreSQL
Desmistificando Replicação no PostgreSQLDesmistificando Replicação no PostgreSQL
Desmistificando Replicação no PostgreSQL
 
Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)
Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)
Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)
 
Postgres Big data
Postgres Big dataPostgres Big data
Postgres Big data
 
PostgreSQL-Prático.pdf
PostgreSQL-Prático.pdfPostgreSQL-Prático.pdf
PostgreSQL-Prático.pdf
 
Database Class - Pontos de defasagem e questões de brinde.
Database Class - Pontos de defasagem e questões de brinde.Database Class - Pontos de defasagem e questões de brinde.
Database Class - Pontos de defasagem e questões de brinde.
 
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
 

Mehr von 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
 
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
 
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 - PGCon2015 Presentation June, 2015
GSoC2014 - PGCon2015 Presentation June, 2015GSoC2014 - PGCon2015 Presentation June, 2015
GSoC2014 - PGCon2015 Presentation June, 2015Fabrízio Mello
 
GSoC2014 - Uniritter Presentation May, 2015
GSoC2014 - Uniritter Presentation May, 2015GSoC2014 - Uniritter Presentation May, 2015
GSoC2014 - Uniritter Presentation May, 2015Fabrízio Mello
 
Tutorial Database Refactoring
Tutorial Database RefactoringTutorial Database Refactoring
Tutorial Database RefactoringFabrízio Mello
 
Sharing Code and Experiences
Sharing Code and ExperiencesSharing Code and Experiences
Sharing Code and ExperiencesFabrízio Mello
 
Software Delivery Like a Boss
Software Delivery Like a BossSoftware Delivery Like a Boss
Software Delivery Like a BossFabrízio Mello
 
Dojo PHP (treinanto programação orientada a objetos em PHP)
Dojo PHP (treinanto programação orientada a objetos em PHP)Dojo PHP (treinanto programação orientada a objetos em PHP)
Dojo PHP (treinanto programação orientada a objetos em PHP)Fabrízio Mello
 
EXPLicando o Explain no PostgreSQL
EXPLicando o Explain no PostgreSQLEXPLicando o Explain no PostgreSQL
EXPLicando o Explain no PostgreSQLFabrízio Mello
 
Planejador de Consultas do PostgreSQL
Planejador de Consultas do PostgreSQLPlanejador de Consultas do PostgreSQL
Planejador de Consultas do PostgreSQLFabrí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
 

Mehr von Fabrízio Mello (20)

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...
 
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
 
Keep calm and Database Continuous Deployment
Keep calm and Database Continuous DeploymentKeep calm and Database Continuous Deployment
Keep calm and Database Continuous Deployment
 
GSoC2014 - PGCon2015 Presentation June, 2015
GSoC2014 - PGCon2015 Presentation June, 2015GSoC2014 - PGCon2015 Presentation June, 2015
GSoC2014 - PGCon2015 Presentation June, 2015
 
GSoC2014 - Uniritter Presentation May, 2015
GSoC2014 - Uniritter Presentation May, 2015GSoC2014 - Uniritter Presentation May, 2015
GSoC2014 - Uniritter Presentation May, 2015
 
Tutorial Database Refactoring
Tutorial Database RefactoringTutorial Database Refactoring
Tutorial Database Refactoring
 
Sharing Code and Experiences
Sharing Code and ExperiencesSharing Code and Experiences
Sharing Code and Experiences
 
Software Delivery Like a Boss
Software Delivery Like a BossSoftware Delivery Like a Boss
Software Delivery Like a Boss
 
Dojo PHP (treinanto programação orientada a objetos em PHP)
Dojo PHP (treinanto programação orientada a objetos em PHP)Dojo PHP (treinanto programação orientada a objetos em PHP)
Dojo PHP (treinanto programação orientada a objetos em PHP)
 
Dojo plpgsql
Dojo plpgsqlDojo plpgsql
Dojo plpgsql
 
EXPLicando o Explain no PostgreSQL
EXPLicando o Explain no PostgreSQLEXPLicando o Explain no PostgreSQL
EXPLicando o Explain no PostgreSQL
 
Planejador de Consultas do PostgreSQL
Planejador de Consultas do PostgreSQLPlanejador de Consultas do PostgreSQL
Planejador de Consultas do PostgreSQL
 
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
 

Bad Smells (mal cheiros) em Bancos de Dados

  • 1. Bad Smells (mal cheiros) em Bancos de Dados timbira A empresa brasileira de PostgreSQL SAADS, IFSul, Bagé/RS, 2017-10-20
  • 2. Palestrante timbira • Fabrízio de Royes Mello • Desenvolvedor PostgreSQL • Líder do PostgreSQL Brasil • Pós-Graduado 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 / 48
  • 3. Background timbira Timbira - A empresa brasileira de PostgreSQL 3 / 48
  • 4. Resumo timbira 1 Introdução 2 Bad Smells 3 Considerações Finais Timbira - A empresa brasileira de PostgreSQL 4 / 48
  • 5. Software Quality Assurance timbira ”Consiste em uma forma de monitorar os Processos e Métodos de Engenharia de Software utilizados afim de garantir Qualidade.” (Wikipedia) Timbira - A empresa brasileira de PostgreSQL 5 / 48
  • 6. Quem não quer um selo destes ?? timbira Timbira - A empresa brasileira de PostgreSQL 6 / 48
  • 7. Ou talvez um destes ... timbira Timbira - A empresa brasileira de PostgreSQL 7 / 48
  • 8. Melhoria timbira Timbira - A empresa brasileira de PostgreSQL 8 / 48
  • 9. Mas e o Banco de Dados???? Timbira - A empresa brasileira de PostgreSQL 9 / 48
  • 10. Bancos de Dados timbira Tendem a se deteriorar ao longo do tempo. Alguns motivos: Timbira - A empresa brasileira de PostgreSQL 10 / 48
  • 11. 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 10 / 48
  • 12. Refatoração em Bancos de Dados timbira Deterioração + Mudanças em Requisitos = Necessidade de Refatoração. Timbira - A empresa brasileira de PostgreSQL 11 / 48
  • 13. 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? Timbira - A empresa brasileira de PostgreSQL 11 / 48
  • 14. 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 11 / 48
  • 15. Resumo timbira 1 Introdução 2 Bad Smells 3 Considerações Finais Timbira - A empresa brasileira de PostgreSQL 12 / 48
  • 16. Code Smell timbira É uma categoria comum de problema no código fonte que indica a necessidade de refatoração. (Martin Fowler) Timbira - A empresa brasileira de PostgreSQL 13 / 48
  • 17. 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 14 / 48
  • 18. 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 15 / 48
  • 19. Multi-purpose column timbira ^^I^^ICREATE TABLE pessoa ( ^^I^^I id SERIAL PRIMARY KEY, ^^I^^I tipo CHAR(1) CHECK (tipo IN ('F', 'J')), ^^I^^I nome VARCHAR(100) NOT NULL, ^^I^^I data DATE ^^I^^I); ^^I Timbira - A empresa brasileira de PostgreSQL 16 / 48
  • 20. Multi-purpose column timbira ^^I^^ICREATE TABLE pessoa ( ^^I^^I id SERIAL PRIMARY KEY, ^^I^^I tipo CHAR(1) CHECK (tipo IN ('F', 'J')), ^^I^^I nome VARCHAR(100) NOT NULL, ^^I^^I data DATE ^^I^^I); ^^I • Se tipo = ’F’ então DATA = nascimento • Se tipo = ’J’ então DATA = inicio atividades Timbira - A empresa brasileira de PostgreSQL 16 / 48
  • 21. Multi-purpose column timbira Sugestão(ões) Database Refactoring: • Split Column • Move Column Timbira - A empresa brasileira de PostgreSQL 17 / 48
  • 22. 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 18 / 48
  • 23. Multi-purpose table timbira ^^I^^ICREATE TABLE pessoa ( ^^I^^I id SERIAL PRIMARY KEY, ^^I^^I nome VARCHAR(100) NOT NULL, ^^I^^I nome_fantasia VARCHAR(100), ^^I^^I cnpj CHAR(14), ^^I^^I cpf CHAR(11), ^^I^^I rg CHAR(10), ^^I^^I data DATE ^^I^^I); ^^I Timbira - A empresa brasileira de PostgreSQL 19 / 48
  • 24. Multi-purpose table timbira ^^I^^ICREATE TABLE pessoa ( ^^I^^I id SERIAL PRIMARY KEY, ^^I^^I nome VARCHAR(100) NOT NULL, ^^I^^I nome_fantasia VARCHAR(100), ^^I^^I cnpj CHAR(14), ^^I^^I cpf CHAR(11), ^^I^^I rg CHAR(10), ^^I^^I data DATE ^^I^^I); ^^I • Se cnpj e nome_fantasia = NULL então NOME = nome pessoa física • Se cpf e rg = NULL então NOME = razão social Timbira - A empresa brasileira de PostgreSQL 19 / 48
  • 25. Multi-purpose table timbira Sugestão(ões) Database Refactoring: • Move Column • Split Table Timbira - A empresa brasileira de PostgreSQL 20 / 48
  • 26. Database Smell timbira Redundant data É um problema sério em bases de dados porque quando o dado é armazenado em vários locais, existe risco de ocorrer inconsistência. Timbira - A empresa brasileira de PostgreSQL 21 / 48
  • 27. Redundant data timbira ^^I^^ICREATE TABLE sys.usuario ( ^^I^^I id SERIAL PRIMARY KEY, ^^I^^I nome VARCHAR(100) NOT NULL, ^^I^^I endereco VARCHAR(100), ^^I^^I numero INTEGER, ^^I^^I complemento VARCHAR(40) ^^I^^I); ^^I^^ICREATE TABLE rh.funcionario ( ^^I^^I id SERIAL PRIMARY KEY, ^^I^^I nome VARCHAR(100) NOT NULL, ^^I^^I endereco VARCHAR(100), ^^I^^I numero INTEGER, ^^I^^I complemento VARCHAR(40) ^^I^^I); ^^I Timbira - A empresa brasileira de PostgreSQL 22 / 48
  • 28. Redundant data timbira Sugestão(ões) Database Refactoring: • Merge Tables • Move Data • Drop Column Timbira - A empresa brasileira de PostgreSQL 23 / 48
  • 29. 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 24 / 48
  • 30. Tables with too many columns timbira ^^I^^ICREATE TABLE pessoa ( ^^I^^I id SERIAL PRIMARY KEY, ^^I^^I nome VARCHAR(100) NOT NULL, ^^I^^I end_entrega VARCHAR(200), ^^I^^I end_cobranca VARCHAR(200), ^^I^^I end_residenc VARCHAR(200), ^^I^^I end_profiss VARCHAR(200), ^^I^^I fone_celular VARCHAR(20), ^^I^^I fone_casa VARCHAR(20), ^^I^^I fone_fax VARCHAR(20), ^^I^^I fone_contato VARCHAR(20) ^^I^^I); ^^I Timbira - A empresa brasileira de PostgreSQL 25 / 48
  • 31. Tables with too many columns timbira ^^I^^ICREATE TABLE parametro ( ^^I^^I parametro1 VARCHAR(100), ^^I^^I parametro2 VARCHAR(100), ^^I^^I parametro3 VARCHAR(100), ^^I^^I parametro4 VARCHAR(100), ^^I^^I parametro5 VARCHAR(100), ^^I^^I parametro6 VARCHAR(100), ^^I^^I ... ^^I^^I parametroN VARCHAR(100) ^^I^^I); ^^I Timbira - A empresa brasileira de PostgreSQL 26 / 48
  • 32. Tables with too many columns timbira Sugestão(ões) Database Refactoring: • Split Table • Move Column Timbira - A empresa brasileira de PostgreSQL 27 / 48
  • 33. 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 28 / 48
  • 34. Tables with too many rows timbira ^^ICREATE TABLE log ( ^^I logtime TIMESTAMP, ^^I user_name TEXT, ^^I context CHAR(10), ^^I message TEXT, ^^I detail TEXT ^^I); ^^ICREATE TABLE log_201401() INHERITS (log); ^^ICREATE TABLE log_201402() INHERITS (log); ^^I... ^^ICREATE TABLE log_201503() INHERITS (log); ^^I Timbira - A empresa brasileira de PostgreSQL 29 / 48
  • 35. Tables with too many rows timbira Sugestão(ões) Database Refactoring: • Split Table • Move Rows • Move Column Timbira - A empresa brasileira de PostgreSQL 30 / 48
  • 36. 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écnica como ”Particionamento de Tabelas” Timbira - A empresa brasileira de PostgreSQL 30 / 48
  • 37. Database Smell timbira Smart columns Coluna que armazena informações de mais de um contexto (concatenação de informações). Timbira - A empresa brasileira de PostgreSQL 31 / 48
  • 38. Smart columns timbira ^^I^^ICREATE TABLE processo ( ^^I^^I numero CHAR(10) PRIMARY KEY, ^^I^^I ... ^^I^^I); ^^I^^ICREATE TABLE debito ( ^^I^^I processamento CHAR(15) PRIMARY KEY ^^I^^I ... ^^I^^I); ^^I Timbira - A empresa brasileira de PostgreSQL 32 / 48
  • 39. Smart columns timbira ^^I^^ICREATE TABLE processo ( ^^I^^I numero CHAR(10) PRIMARY KEY, ^^I^^I ... ^^I^^I); ^^I^^ICREATE TABLE debito ( ^^I^^I processamento CHAR(15) PRIMARY KEY ^^I^^I ... ^^I^^I); ^^I • 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 32 / 48
  • 40. Smart columns timbira Sugestão(ões) Database Refactoring: • Split Column Timbira - A empresa brasileira de PostgreSQL 33 / 48
  • 41. 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 34 / 48
  • 42. Phantom foreign-key timbira ^^I^^ICREATE TABLE tabela ( ^^I^^I ... ^^I^^I tipo INTEGER, ^^I^^I codigo INTEGER, ^^I^^I ... ^^I^^I); ^^I Timbira - A empresa brasileira de PostgreSQL 35 / 48
  • 43. Phantom foreign-key timbira ^^I^^ICREATE TABLE tabela ( ^^I^^I ... ^^I^^I tipo INTEGER, ^^I^^I codigo INTEGER, ^^I^^I ... ^^I^^I); ^^I • 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 35 / 48
  • 44. Phantom foreign-key timbira Sugestão(ões) Database Refactoring: • Introduce new table • Introduce table constraint • Move Column Timbira - A empresa brasileira de PostgreSQL 36 / 48
  • 45. 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 37 / 48
  • 46. Wrong data type timbira ^^I^^ICREATE TABLE pessoa ( ^^I^^I id SERIAL PRIMARY KEY, ^^I^^I nome VARCHAR(100) NOT NULL, ^^I^^I cnpj CHAR(14), ^^I^^I cpf CHAR(11), ^^I^^I rg CHAR(10) ^^I^^I); ^^I^^ICREATE TABLE atributo_dinamico ( ^^I^^I nome VARCHAR(100), ^^I^^I tipo INTEGER, ^^I^^I valor TEXT ^^I^^I); ^^I Timbira - A empresa brasileira de PostgreSQL 38 / 48
  • 47. Wrong data type timbira ^^I^^ICREATE TABLE pessoa ( ^^I^^I id SERIAL PRIMARY KEY, ^^I^^I nome VARCHAR(100) NOT NULL, ^^I^^I cnpj CHAR(14), ^^I^^I cpf CHAR(11), ^^I^^I rg CHAR(10) ^^I^^I); ^^I^^ICREATE TABLE atributo_dinamico ( ^^I^^I nome VARCHAR(100), ^^I^^I tipo INTEGER, ^^I^^I valor TEXT ^^I^^I); ^^I • CNPJ, CPF e RG não são números? • VALOR é um campo ”flex”, WTF? Timbira - A empresa brasileira de PostgreSQL 38 / 48
  • 48. Wrong data type timbira Sugestão(ões) Database Refactoring: • Replace column Timbira - A empresa brasileira de PostgreSQL 39 / 48
  • 49. Database Smell timbira Trigger Spaghetti Quando 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 na tabela C, onde também existe outra trigger, que também dependendo de algumas condições faz operações na tabela A, onde de certa forma garante que nao seja gerado um loop infinito. WTF?? Timbira - A empresa brasileira de PostgreSQL 40 / 48
  • 50. Database Smell timbira Trigger Spaghetti Se você tem isso, saiba que existe um lugarzinho especial reservado pra você ”In the Hell” !!! Sério... NÂO FAÇA ISSO!!!. Timbira - A empresa brasileira de PostgreSQL 41 / 48
  • 51. Database Smell timbira Smells detectados pela minha experiência (ainda não estão na literatura): • Phantom foreign-key • Wrong data type • Trigger Spaghetti Timbira - A empresa brasileira de PostgreSQL 42 / 48
  • 52. 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: Timbira - A empresa brasileira de PostgreSQL 43 / 48
  • 53. 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. Timbira - A empresa brasileira de PostgreSQL 43 / 48
  • 54. Database Smell timbira Fear of change A solução para esse smell é mais uma questão de postura positiva do time aliada a adoção de boas práticas, tais como: Timbira - A empresa brasileira de PostgreSQL 44 / 48
  • 55. Database Smell timbira Fear of change A solução para esse smell é mais uma questão de postura positiva do time aliada a adoção de boas práticas, tais como: • database refactoring; • database unit and regression tests; • database continuous integration; • schema versioning. Timbira - A empresa brasileira de PostgreSQL 44 / 48
  • 56. Resumo timbira 1 Introdução 2 Bad Smells 3 Considerações Finais Timbira - A empresa brasileira de PostgreSQL 45 / 48
  • 57. 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 46 / 48
  • 58. Dúvidas timbira ? Fabrízio de Royes Mello @fabriziomello fabrizio@timbira.com.br fabriziomello@gmail.com http://www.timbira.com.br http://slideshare.net/fabriziomello Timbira - A empresa brasileira de PostgreSQL 47 / 48
  • 59. Referências timbira • 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 48 / 48