SlideShare a Scribd company logo
1 of 38
Download to read offline
Bad Smells 
em 
Bancos de Dados 
Fabrízio Mello Guilherme Lacerda 
@fabriziomello @guilhermeslac
Quem somos nós? 
Fabrízio de Royes Mello @fabriziomello 
● Desenvolvedor PostgreSQL 
● Líder PostgreSQL Brasil 
● Pós-Graduando Uniritter (Agile) 
● http://fabriziomello.github.io 
Guilherme Silva de Lacerda @guilhermeslac 
● Consultor e Professor Universitário 
● Doutorando em Ciência da Computação 
● http://www.guilhermelacerda.net
Agenda 
● Refatoração e Código vs Refatoração 
em Banco 
● Dívida Técnica 
● Database Smells e Refatorações 
● Considerações Finais
Bancos de Dados 
Tendem a se deteriorar ao longo do 
tempo. Alguns motivos: 
● crescimento volume de 
dados/transações 
● aumento natural de usuários ativos 
● dificuldade na evolução do schema 
● estratégias de manutenção
Refatoração de Banco de Dados 
Deterioração + Mudanças em Requisitos = 
Necessidade de Refatoração 
Mas não é tão simples quanto parece: 
● além de manter comportamento 
também é preciso manter informação 
(dados) 
● acoplamento com diversas origens 
(apps, bds, integrações, 3rd, …)
Code Smell 
“É uma categoria comum de problema no 
código fonte que indica a necessidade de 
refatoração.” (Martin Fowler)
Database Smell 
“Similarmente aos Code Smells existem 
problemas comuns em bancos de dados 
que indicam uma potencial necessidade 
de refatoração” (Scott Ambler)
Database Smell 
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.
Multi-purpose column 
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
Multi-purpose column 
Sugestão(ões) de Database Refactoring 
● Split Column 
● Move Column
Database Smell 
Multi-purpose table 
Quanto uma tabela é utilizada para 
armazenar vários tipos de entidades 
provavelmente existe uma falha de projeto.
Multi-purpose table 
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) 
); 
Se cnpj e nome_fantasia = NULL então NOME = nome 
pessoa física 
Se cpf e rg = NULL então NOME = razão social
Multi-purpose table 
Sugestão(ões) de Database Refactoring 
● Split Column 
● Move Column 
● Split Table
Database Smell 
Redundant Data 
É um problema sério em bases de dados, 
porque quando o dado é armazenado em 
vários locais, existe risco de ocorrer 
inconsistências.
Redundant Data 
CREATE TABLE sys.usuario ( 
id SERIAL PRIMARY KEY, 
login VARCHAR(100) NOT NULL, 
nome VARCHAR(100) NOT NULL 
); 
CREATE TABLE rh.funcionario ( 
id SERIAL PRIMARY KEY, 
nome VARCHAR(100) NOT NULL, 
endereco VARCHAR(100), 
numero INTEGER, 
complemento VARCHAR(40) 
);
Redundant Data 
Sugestão(ões) de Database Refactoring 
● Merge Tables 
● Move Data 
● Drop Column
Database Smell 
Table with too many columns 
Quando uma tabela tem muitas colunas é 
indicativo de falta de coesão, pois está 
armazenando dados de várias entidades.
Table with too many columns 
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) 
);
Table with too many columns 
CREATE TABLE parametro ( 
parametro1 VARCHAR(100), 
parametro2 VARCHAR(100), 
parametro3 VARCHAR(100), 
parametro4 VARCHAR(100), 
parametro5 VARCHAR(100), 
parametro6 VARCHAR(100), 
parametro7 VARCHAR(100), 
parametro8 VARCHAR(100), 
... 
parametroN VARCHAR(100) 
);
Table with too many columns 
Sugestão(ões) de Database Refactoring 
● Split Table 
● Move Column
Database Smell 
Table 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
Table with too many rows 
CREATE TABLE log ( 
logtime TIMESTAMP, 
user_name TEXT, 
context CHAR(10), 
message TEXT, 
detail TEXT 
); 
CREATE TABLE log_200602() INHERITS (log); 
CREATE TABLE log_200603() INHERITS (log); 
... 
CREATE TABLE log_201411() INHERITS (log); 
CREATE TABLE log_201412() INHERITS (log);
Table with too many rows 
Sugestão(ões) de Database Refactoring 
● Split Table 
● Move Rows 
● Move Column
Database Smell 
Smart columns 
Coluna que armazena informações de mais 
de um contexto (concatenação de 
informações)
Smart columns 
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
Smart Columns 
Sugestão(ões) de Database Refactoring 
● Split Column
Database Smell 
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.
Phantom foreign-key 
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
Phantom foreign-key 
Sugestão(ões) de Database Refactoring 
● Introduce new table 
● Introduce table constraint 
● Move column
Database Smell 
Wrong data type 
Tipos de dados possuem uma assinatura, 
que descreve as validações mínimas para o 
seu uso.
Wrong data type 
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 
);
Wrong data type 
Sugestão(ões) de Database Refactoring 
● Replace column
Database Smells 
Smells que detectados pela minha 
experiência (não estão na literatura) 
● Phantom foreign-key 
● Wring data-type 
● Trigger Spaghetti
Database Smells 
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 inovação 
● reduz a efetividade 
● produz ainda mais bagunça 
● ao longo do tempo a situação fica pior
Considerações Finais 
Á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
Dúvidas?
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
Obrigado! 
Deixe seu feedback aqui: 
bit.ly/xp-feed 
Bad Smells em Bancos de Dados 
Fabrízio Mello e Guilherme Lacerda 
Conferência sobre Extreme Programming 
em Porto Alegre, dez/2014.

More Related Content

What's hot

Minicurso PostgreSQL
Minicurso PostgreSQLMinicurso PostgreSQL
Minicurso PostgreSQLDiogo Biazus
 
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
 
Criação de log de ações através do banco - PostgreSQL
Criação de log de ações através do banco - PostgreSQLCriação de log de ações através do banco - PostgreSQL
Criação de log de ações através do banco - PostgreSQLMarcos Thomaz
 
Sql com sql server básico - Bóson treinamentos
Sql com sql server básico - Bóson treinamentosSql com sql server básico - Bóson treinamentos
Sql com sql server básico - Bóson treinamentosFábio dos Reis
 
Banco de Dados - MySQL Basico
Banco de Dados - MySQL BasicoBanco de Dados - MySQL Basico
Banco de Dados - MySQL BasicoRangel Javier
 
Linguagem SQL (com MySQL)
Linguagem SQL (com MySQL)Linguagem SQL (com MySQL)
Linguagem SQL (com MySQL)Marco Pinheiro
 
Sql básico - Teoria e prática: Um grande resumo
Sql básico - Teoria e prática: Um grande resumoSql básico - Teoria e prática: Um grande resumo
Sql básico - Teoria e prática: Um grande resumoHelder Lopes
 
Exercícios de mysql
Exercícios de mysqlExercícios de mysql
Exercícios de mysqlLeo Frazão
 
Banco de dados comandos sql
Banco de dados   comandos sqlBanco de dados   comandos sql
Banco de dados comandos sqlNilson Augustini
 
BD I - Aula 15 C - Manutencao de tabelas
BD I - Aula 15 C - Manutencao de tabelasBD I - Aula 15 C - Manutencao de tabelas
BD I - Aula 15 C - Manutencao de tabelasRodrigo Kiyoshi Saito
 
Apresentação básica de my sql
Apresentação básica de my sqlApresentação básica de my sql
Apresentação básica de my sqlMarcus Couto
 
MANUTENÇÃO DE ÍNDICES: O GUIA DEFINITIVO
MANUTENÇÃO DE ÍNDICES: O GUIA DEFINITIVOMANUTENÇÃO DE ÍNDICES: O GUIA DEFINITIVO
MANUTENÇÃO DE ÍNDICES: O GUIA DEFINITIVOLuciano Moreira
 
Aula de SQL - Básico
Aula de SQL - BásicoAula de SQL - Básico
Aula de SQL - BásicoAirton Zanon
 

What's hot (20)

Minicurso PostgreSQL
Minicurso PostgreSQLMinicurso PostgreSQL
Minicurso PostgreSQL
 
Aula2 - SQL
Aula2 - SQLAula2 - SQL
Aula2 - SQL
 
Aprofundamento de DDL e DML
Aprofundamento de DDL e DMLAprofundamento de DDL e DML
Aprofundamento de DDL e DML
 
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
 
Criação de log de ações através do banco - PostgreSQL
Criação de log de ações através do banco - PostgreSQLCriação de log de ações através do banco - PostgreSQL
Criação de log de ações através do banco - PostgreSQL
 
Aula10 sql-ddl
Aula10 sql-ddlAula10 sql-ddl
Aula10 sql-ddl
 
Sql com sql server básico - Bóson treinamentos
Sql com sql server básico - Bóson treinamentosSql com sql server básico - Bóson treinamentos
Sql com sql server básico - Bóson treinamentos
 
Banco de Dados - MySQL Basico
Banco de Dados - MySQL BasicoBanco de Dados - MySQL Basico
Banco de Dados - MySQL Basico
 
Consultas SQL
Consultas SQLConsultas SQL
Consultas SQL
 
Linguagem SQL (com MySQL)
Linguagem SQL (com MySQL)Linguagem SQL (com MySQL)
Linguagem SQL (com MySQL)
 
Sql básico - Teoria e prática: Um grande resumo
Sql básico - Teoria e prática: Um grande resumoSql básico - Teoria e prática: Um grande resumo
Sql básico - Teoria e prática: Um grande resumo
 
Bd ii material
Bd ii   materialBd ii   material
Bd ii material
 
Exercícios de mysql
Exercícios de mysqlExercícios de mysql
Exercícios de mysql
 
Banco de dados comandos sql
Banco de dados   comandos sqlBanco de dados   comandos sql
Banco de dados comandos sql
 
BD I - Aula 15 C - Manutencao de tabelas
BD I - Aula 15 C - Manutencao de tabelasBD I - Aula 15 C - Manutencao de tabelas
BD I - Aula 15 C - Manutencao de tabelas
 
Apresentação básica de my sql
Apresentação básica de my sqlApresentação básica de my sql
Apresentação básica de my sql
 
Introdução ao SQL
Introdução ao SQLIntrodução ao SQL
Introdução ao SQL
 
MANUTENÇÃO DE ÍNDICES: O GUIA DEFINITIVO
MANUTENÇÃO DE ÍNDICES: O GUIA DEFINITIVOMANUTENÇÃO DE ÍNDICES: O GUIA DEFINITIVO
MANUTENÇÃO DE ÍNDICES: O GUIA DEFINITIVO
 
Linguagem SQL
Linguagem SQLLinguagem SQL
Linguagem SQL
 
Aula de SQL - Básico
Aula de SQL - BásicoAula de SQL - Básico
Aula de SQL - Básico
 

Viewers also liked

Bad Smells (mal cheiros) em Bancos de Dados
Bad Smells (mal cheiros) em Bancos de DadosBad Smells (mal cheiros) em Bancos de Dados
Bad Smells (mal cheiros) em Bancos de DadosFabrí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
 
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
 
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 - 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
 
GSoC2014 - PGCon2015 Presentation June, 2015
GSoC2014 - PGCon2015 Presentation June, 2015GSoC2014 - PGCon2015 Presentation June, 2015
GSoC2014 - PGCon2015 Presentation June, 2015Fabrí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
 
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
 
PROCERGS 2015-03-25: Bad Smells em Bancos de Dados
PROCERGS 2015-03-25: Bad Smells em Bancos de DadosPROCERGS 2015-03-25: Bad Smells em Bancos de Dados
PROCERGS 2015-03-25: Bad Smells em Bancos de DadosFabrí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
 
Sharing Code and Experiences
Sharing Code and ExperiencesSharing Code and Experiences
Sharing Code and ExperiencesFabrízio Mello
 
GSoC2014 - Uniritter Presentation May, 2015
GSoC2014 - Uniritter Presentation May, 2015GSoC2014 - Uniritter Presentation May, 2015
GSoC2014 - Uniritter Presentation May, 2015Fabrízio Mello
 
Planejador de Consultas do PostgreSQL
Planejador de Consultas do PostgreSQLPlanejador de Consultas do PostgreSQL
Planejador de Consultas do PostgreSQLFabrízio Mello
 

Viewers also liked (16)

Bad Smells (mal cheiros) em Bancos de Dados
Bad Smells (mal cheiros) em Bancos de DadosBad Smells (mal cheiros) em Bancos de Dados
Bad Smells (mal cheiros) em Bancos de Dados
 
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)
 
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)
 
Como posso colaborar com o PostgreSQL
Como posso colaborar com o PostgreSQLComo posso colaborar com o PostgreSQL
Como posso colaborar com o PostgreSQL
 
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
 
GSoC2014 - PGCon2015 Presentation June, 2015
GSoC2014 - PGCon2015 Presentation June, 2015GSoC2014 - PGCon2015 Presentation June, 2015
GSoC2014 - PGCon2015 Presentation June, 2015
 
Keep calm and Database Continuous Deployment
Keep calm and Database Continuous DeploymentKeep calm and Database Continuous Deployment
Keep calm and Database Continuous Deployment
 
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
 
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)
 
PROCERGS 2015-03-25: Bad Smells em Bancos de Dados
PROCERGS 2015-03-25: Bad Smells em Bancos de DadosPROCERGS 2015-03-25: Bad Smells em Bancos de Dados
PROCERGS 2015-03-25: Bad Smells em Bancos de Dados
 
Postgres Wonderland - PGDay Cascavél 2013
Postgres Wonderland - PGDay Cascavél 2013Postgres Wonderland - PGDay Cascavél 2013
Postgres Wonderland - PGDay Cascavél 2013
 
Sharing Code and Experiences
Sharing Code and ExperiencesSharing Code and Experiences
Sharing Code and Experiences
 
GSoC2014 - Uniritter Presentation May, 2015
GSoC2014 - Uniritter Presentation May, 2015GSoC2014 - Uniritter Presentation May, 2015
GSoC2014 - Uniritter Presentation May, 2015
 
Planejador de Consultas do PostgreSQL
Planejador de Consultas do PostgreSQLPlanejador de Consultas do PostgreSQL
Planejador de Consultas do PostgreSQL
 

Similar to Bad Smells BD

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
 
MySQL - Wagner Bonfiglio - Navegg
MySQL - Wagner Bonfiglio - NaveggMySQL - Wagner Bonfiglio - Navegg
MySQL - Wagner Bonfiglio - NaveggFelipe Guimarães
 
Minicurso PostgreSQl
Minicurso PostgreSQlMinicurso PostgreSQl
Minicurso PostgreSQlCezar Souza
 
Banco de dados aula 4
Banco de dados aula 4Banco de dados aula 4
Banco de dados aula 4Ed W. Jr
 
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
 
Modulo-02-Aula-02-conteudo-de-certi.pptx
Modulo-02-Aula-02-conteudo-de-certi.pptxModulo-02-Aula-02-conteudo-de-certi.pptx
Modulo-02-Aula-02-conteudo-de-certi.pptxAugustoNicolau2
 
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
 
Criação de log de ações através do banco
Criação de log de ações através do bancoCriação de log de ações através do banco
Criação de log de ações através do bancoMarcos Thomaz
 
Conceitos Basicos em Banco de Dados
Conceitos Basicos em Banco de DadosConceitos Basicos em Banco de Dados
Conceitos Basicos em Banco de DadosAlefe Variani
 
6338 111121071604-phpapp01
6338 111121071604-phpapp016338 111121071604-phpapp01
6338 111121071604-phpapp01Gilson Figueredo
 

Similar to Bad Smells BD (20)

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
 
MySQL - Workshop Buscapé
MySQL - Workshop BuscapéMySQL - Workshop Buscapé
MySQL - Workshop Buscapé
 
MySQL - Wagner Bonfiglio - Navegg
MySQL - Wagner Bonfiglio - NaveggMySQL - Wagner Bonfiglio - Navegg
MySQL - Wagner Bonfiglio - Navegg
 
Aula 10 banco de dados
Aula 10   banco de dadosAula 10   banco de dados
Aula 10 banco de dados
 
Minicurso PostgreSQl
Minicurso PostgreSQlMinicurso PostgreSQl
Minicurso PostgreSQl
 
Postgres Big data
Postgres Big dataPostgres Big data
Postgres Big data
 
Dojo banco de dados
Dojo   banco de dadosDojo   banco de dados
Dojo banco de dados
 
Postgres Tuning
Postgres TuningPostgres Tuning
Postgres Tuning
 
Banco de dados aula 4
Banco de dados aula 4Banco de dados aula 4
Banco de dados aula 4
 
Apostila - Banco de Dados
Apostila - Banco de DadosApostila - Banco de Dados
Apostila - Banco de Dados
 
Aula 10 banco de dados
Aula 10   banco de dadosAula 10   banco de dados
Aula 10 banco de dados
 
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)
 
Modulo 15 PSI
Modulo 15 PSIModulo 15 PSI
Modulo 15 PSI
 
Modulo-02-Aula-02-conteudo-de-certi.pptx
Modulo-02-Aula-02-conteudo-de-certi.pptxModulo-02-Aula-02-conteudo-de-certi.pptx
Modulo-02-Aula-02-conteudo-de-certi.pptx
 
Sql
SqlSql
Sql
 
Otimizando a performance com in memory no sql 2016
Otimizando a performance com in memory no sql 2016Otimizando a performance com in memory no sql 2016
Otimizando a performance com in memory no sql 2016
 
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
 
Criação de log de ações através do banco
Criação de log de ações através do bancoCriação de log de ações através do banco
Criação de log de ações através do banco
 
Conceitos Basicos em Banco de Dados
Conceitos Basicos em Banco de DadosConceitos Basicos em Banco de Dados
Conceitos Basicos em Banco de Dados
 
6338 111121071604-phpapp01
6338 111121071604-phpapp016338 111121071604-phpapp01
6338 111121071604-phpapp01
 

More from 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
 
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
 
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
 

More from Fabrízio Mello (12)

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
 
NoSQL + SQL = PostgreSQL (PGDay Campinas 2014)
NoSQL + SQL = PostgreSQL (PGDay Campinas 2014)NoSQL + SQL = PostgreSQL (PGDay Campinas 2014)
NoSQL + SQL = PostgreSQL (PGDay Campinas 2014)
 
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 BD

  • 1. Bad Smells em Bancos de Dados Fabrízio Mello Guilherme Lacerda @fabriziomello @guilhermeslac
  • 2. Quem somos nós? Fabrízio de Royes Mello @fabriziomello ● Desenvolvedor PostgreSQL ● Líder PostgreSQL Brasil ● Pós-Graduando Uniritter (Agile) ● http://fabriziomello.github.io Guilherme Silva de Lacerda @guilhermeslac ● Consultor e Professor Universitário ● Doutorando em Ciência da Computação ● http://www.guilhermelacerda.net
  • 3. Agenda ● Refatoração e Código vs Refatoração em Banco ● Dívida Técnica ● Database Smells e Refatorações ● Considerações Finais
  • 4. Bancos de Dados Tendem a se deteriorar ao longo do tempo. Alguns motivos: ● crescimento volume de dados/transações ● aumento natural de usuários ativos ● dificuldade na evolução do schema ● estratégias de manutenção
  • 5. Refatoração de Banco de Dados Deterioração + Mudanças em Requisitos = Necessidade de Refatoração Mas não é tão simples quanto parece: ● além de manter comportamento também é preciso manter informação (dados) ● acoplamento com diversas origens (apps, bds, integrações, 3rd, …)
  • 6. Code Smell “É uma categoria comum de problema no código fonte que indica a necessidade de refatoração.” (Martin Fowler)
  • 7. Database Smell “Similarmente aos Code Smells existem problemas comuns em bancos de dados que indicam uma potencial necessidade de refatoração” (Scott Ambler)
  • 8. Database Smell 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.
  • 9. Multi-purpose column 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
  • 10. Multi-purpose column Sugestão(ões) de Database Refactoring ● Split Column ● Move Column
  • 11. Database Smell Multi-purpose table Quanto uma tabela é utilizada para armazenar vários tipos de entidades provavelmente existe uma falha de projeto.
  • 12. Multi-purpose table 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) ); Se cnpj e nome_fantasia = NULL então NOME = nome pessoa física Se cpf e rg = NULL então NOME = razão social
  • 13. Multi-purpose table Sugestão(ões) de Database Refactoring ● Split Column ● Move Column ● Split Table
  • 14. Database Smell Redundant Data É um problema sério em bases de dados, porque quando o dado é armazenado em vários locais, existe risco de ocorrer inconsistências.
  • 15. Redundant Data CREATE TABLE sys.usuario ( id SERIAL PRIMARY KEY, login VARCHAR(100) NOT NULL, nome VARCHAR(100) NOT NULL ); CREATE TABLE rh.funcionario ( id SERIAL PRIMARY KEY, nome VARCHAR(100) NOT NULL, endereco VARCHAR(100), numero INTEGER, complemento VARCHAR(40) );
  • 16. Redundant Data Sugestão(ões) de Database Refactoring ● Merge Tables ● Move Data ● Drop Column
  • 17. Database Smell Table with too many columns Quando uma tabela tem muitas colunas é indicativo de falta de coesão, pois está armazenando dados de várias entidades.
  • 18. Table with too many columns 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) );
  • 19. Table with too many columns CREATE TABLE parametro ( parametro1 VARCHAR(100), parametro2 VARCHAR(100), parametro3 VARCHAR(100), parametro4 VARCHAR(100), parametro5 VARCHAR(100), parametro6 VARCHAR(100), parametro7 VARCHAR(100), parametro8 VARCHAR(100), ... parametroN VARCHAR(100) );
  • 20. Table with too many columns Sugestão(ões) de Database Refactoring ● Split Table ● Move Column
  • 21. Database Smell Table 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
  • 22. Table with too many rows CREATE TABLE log ( logtime TIMESTAMP, user_name TEXT, context CHAR(10), message TEXT, detail TEXT ); CREATE TABLE log_200602() INHERITS (log); CREATE TABLE log_200603() INHERITS (log); ... CREATE TABLE log_201411() INHERITS (log); CREATE TABLE log_201412() INHERITS (log);
  • 23. Table with too many rows Sugestão(ões) de Database Refactoring ● Split Table ● Move Rows ● Move Column
  • 24. Database Smell Smart columns Coluna que armazena informações de mais de um contexto (concatenação de informações)
  • 25. Smart columns 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
  • 26. Smart Columns Sugestão(ões) de Database Refactoring ● Split Column
  • 27. Database Smell 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.
  • 28. Phantom foreign-key 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
  • 29. Phantom foreign-key Sugestão(ões) de Database Refactoring ● Introduce new table ● Introduce table constraint ● Move column
  • 30. Database Smell Wrong data type Tipos de dados possuem uma assinatura, que descreve as validações mínimas para o seu uso.
  • 31. Wrong data type 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 );
  • 32. Wrong data type Sugestão(ões) de Database Refactoring ● Replace column
  • 33. Database Smells Smells que detectados pela minha experiência (não estão na literatura) ● Phantom foreign-key ● Wring data-type ● Trigger Spaghetti
  • 34. Database Smells 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 inovação ● reduz a efetividade ● produz ainda mais bagunça ● ao longo do tempo a situação fica pior
  • 35. Considerações Finais Á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
  • 37. 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
  • 38. Obrigado! Deixe seu feedback aqui: bit.ly/xp-feed Bad Smells em Bancos de Dados Fabrízio Mello e Guilherme Lacerda Conferência sobre Extreme Programming em Porto Alegre, dez/2014.