Bad Smells em 
Bancos de Dados 
@fabriziomello @guilhermeslac
Quem somos? 
Fabrízio Mello 
 Desenvolvedor PostgreSQL 
 Líder PostgreSQL Brasil 
 Pós-Graduando UniiRitter (Agile) 
 ...
Agenda 
 Introdução 
 Refatoração e Refatoração em BD 
 Database Smells e Refatorações 
 Considerações Finais
Problema com Bancos de Dados 
Tendem a se deteriorar ao longo do tempo. Alguns 
motivos: 
 crescimento volume de dados/tr...
Refatoração de Banco de Dados 
Deterioração + Mudanças em Requisitos = 
Necessidade de Refatoração 
Mas não é tão simples ...
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 nece...
Database Smell 
Multi-purpose column 
Se uma coluna for utilizada para vários fins, é 
provável que exista um código extra...
Multi-purpose column 
CREATE TABLE pessoa ( 
id SERIAL PRIMARY KEY, 
tipo CHAR(1) CHECK (tipo IN ('F', 'J')), 
nome VARCHA...
Multi-purpose column 
Sugestão(ões) Database Refactoring: 
 Split Column 
 Move Column
Database Smell 
Multi-purpose table 
Quando uma tabela é utilizada para armazenar vários 
tipos de entidades provavelmente...
Multi-purpose table 
CREATE TABLE pessoa ( 
id SERIAL PRIMARY KEY, 
nome VARCHAR(100) NOT NULL, 
nome_fantasia VARCHAR(100...
Multi-purpose table 
Sugestão(ões) Database Refactoring: 
 Split Column 
 Move Column
Database Smell 
Redundant data 
É um problema sério em bases de dados, porque 
quando o dado é armazenado em vários locais...
Redundant data 
CREATE TABLE sys.usuario ( 
id SERIAL PRIMARY KEY, 
login VARCHAR(100) NOT NULL, 
nome VARCHAR(100) NOT NU...
Redundant data 
Sugestão(ões) Database Refactoring: 
 Merge Tables 
 Move Data 
 Drop Column
Database Smell 
Tables with too many columns 
Quando uma tabela tem muitas colunas é indicativo de 
falta de coesão, pois ...
Table with too many columns 
CREATE TABLE pessoa ( 
id SERIAL PRIMARY KEY, 
nome VARCHAR(100) NOT NULL, 
end_entrega VARCH...
Table with too many columns 
CREATE TABLE parametro ( 
parametro1 VARCHAR(100), 
parametro2 VARCHAR(100), 
parametro3 VARC...
Table with too many columns 
Sugestão(ões) Database Refactoring: 
 Split Table 
 Move Column
Database Smell 
Tables with too many rows 
Tabelas muito grandes podem nos levar a problemas 
de performance. 
O custo (me...
Table with too many rows 
CREATE TABLE measurement ( 
city_id INTEGER NOT NULL, 
logdate DATE NOT NULL, 
peaktemp INTEGER,...
Table with too many rows 
Sugestão(ões) 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ção).
Smart Columns 
CREATE TABLE processo ( 
numero CHAR(10) PRIMARY KEY, 
... 
); 
CREATE TABLE debito ( 
processamento CHAR(1...
Smart Columns 
Sugestão(ões) Database Refactoring: 
 Split Column
Database Smell 
Phantom foreign-key 
Quando uma coluna em uma tabela pode receber um 
valor que dependendo de outra coluna...
Phantom foreign-key 
CREATE TABLE tabela ( 
... 
tipo INTEGER, 
codigo INTEGER, 
... 
); 
Se TIPO = 1 entao CODIGO é ref. ...
Phantom foreign-key 
Sugestão(ões) Database Refactoring: 
 Introduce new table 
 Introduce table constraint 
 Move colu...
Database Smell 
Wrong data type 
Tipos de dados possuem uma assinatura, que 
descreve as validações mínimas para seu uso.
Wrong data type 
CREATE TABLE pessoa ( 
id SERIAL PRIMARY KEY, 
nome VARCHAR(100) NOT NULL, 
cnpj CHAR(14), 
cpf CHAR(11),...
Wrong data type 
Sugestão(ões) Database Refactoring: 
 Replace column
Database Smell 
Outros smells detectados baseados em experiência 
(não estão na literatura): 
 Phantom foreign-key 
 Wro...
Database Smell 
Fear or change 
Dentre os database smells citados, devemos ter 
atenção especial a este, pois pode ser con...
Considerações finais 
Área com campo vasto a ser explorado 
Taxonomia dos Database Smells 
Database Smells primitivos e co...
Referências 
●Refactoring Improving the Desing of Existing Code (Martin Fowler) 
●Refactoring Databases: Evolutionary Data...
Muito Obrigado! 
g u i l h e r mes l a c e rd a@g m a i l . c o m 
@g u i l h e r mes l a c 
fa b r i z i o me l l o@g m a...
[Agile brazil2014] Bad Smells em Bancos de Dados
Próximos SlideShares
Carregando em…5
×

[Agile brazil2014] Bad Smells em Bancos de Dados

526 visualizações

Publicada em

Apresentação sobre bad smells em Banco de Dados que fizemos no AgileBrazil 2014.

Publicada em: Tecnologia
0 comentários
4 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
526
No SlideShare
0
A partir de incorporações
0
Número de incorporações
5
Ações
Compartilhamentos
0
Downloads
18
Comentários
0
Gostaram
4
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

[Agile brazil2014] Bad Smells em Bancos de Dados

  1. 1. Bad Smells em Bancos de Dados @fabriziomello @guilhermeslac
  2. 2. Quem somos? Fabrízio Mello  Desenvolvedor PostgreSQL  Líder PostgreSQL Brasil  Pós-Graduando UniiRitter (Agile)  @fabriziomello  http://fabriziomello.github.io Guilherme Lacerda  Consultor e Professor Universitário (UniRitter, Unisinos e UFRGS)  Doutorando em Ciência da Computação (UFRGS)  @guilhermeslac  http://www.guilhermelacerda.net
  3. 3. Agenda  Introdução  Refatoração e Refatoração em BD  Database Smells e Refatorações  Considerações Finais
  4. 4. Problema com Bancos de Dados 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.
  5. 5. Refatoração de Banco de Dados Deterioração + Mudanças em Requisitos = Necessidade de Refatoração Mas não é tão simples como parece:  além de manter comportamento também é preciso manter informação (dados)  acoplamento com diversas origens (apps, bds, integrações, 3rd, ...)
  6. 6. Code Smell “É uma categoria comum de problema no código fonte que indica a necessidade de refatoração.” (Martin Fowler)
  7. 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. 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. 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. 10. Multi-purpose column Sugestão(ões) Database Refactoring:  Split Column  Move Column
  11. 11. Database Smell Multi-purpose table Quando uma tabela é utilizada para armazenar vários tipos de entidades provavelmente existe uma falha de projeto.
  12. 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 pessoa jurídica
  13. 13. Multi-purpose table Sugestão(ões) Database Refactoring:  Split Column  Move Column
  14. 14. Database Smell 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.
  15. 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. 16. Redundant data Sugestão(ões) Database Refactoring:  Merge Tables  Move Data  Drop Column
  17. 17. Database Smell 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.
  18. 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. 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. 20. Table with too many columns Sugestão(ões) Database Refactoring:  Split Table  Move Column
  21. 21. Database Smell 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.
  22. 22. Table with too many rows CREATE TABLE measurement ( city_id INTEGER NOT NULL, logdate DATE NOT NULL, peaktemp INTEGER, unitsales INTEGER ); CREATE TABLE measurement_200602() INHERITS (measurement); CREATE TABLE measurement_200603() INHERITS (measurement); ... CREATE TABLE measurement_200711() INHERITS (measurement); CREATE TABLE measurement_200712() INHERITS (measurement); CREATE TABLE measurement_200801() INHERITS (measurement);
  23. 23. Table with too many rows Sugestão(ões) Database Refactoring:  Split Table  Move Rows  Move Column
  24. 24. Database Smell Smart columns Coluna que armazena informações de mais de um contexto (concatenação de informação).
  25. 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. 26. Smart Columns Sugestão(ões) Database Refactoring:  Split Column
  27. 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. 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. 29. Phantom foreign-key Sugestão(ões) Database Refactoring:  Introduce new table  Introduce table constraint  Move column
  30. 30. Database Smell Wrong data type Tipos de dados possuem uma assinatura, que descreve as validações mínimas para seu uso.
  31. 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 ); CNPJ, CPF e RG não são números? VALOR é um campo "flex"
  32. 32. Wrong data type Sugestão(ões) Database Refactoring:  Replace column
  33. 33. Database Smell Outros smells detectados baseados em experiência (não estão na literatura):  Phantom foreign-key  Wrong data type  Trigger Spaghetti
  34. 34. Database Smell Fear or 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.
  35. 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
  36. 36. 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
  37. 37. Muito Obrigado! g u i l h e r mes l a c e rd a@g m a i l . c o m @g u i l h e r mes l a c fa b r i z i o me l l o@g m a i l . c o m @fa b r i z i o me l l o w w w . c o d i n g b y e x a m p l e . o rg w w w . o rg a n i z a c a o v i s u a l . n e t

×