O documento apresenta Fabrizio Mello e Guilherme Lacerda e discute sobre "Bad Smells" em bancos de dados. É apresentada uma agenda e diversos exemplos de problemas comuns em bancos de dados, como colunas multiuso, tabelas multiuso, dados redundantes e sugestões de refatoração.
1. Bad Smells em
Bancos de Dados
@fabriziomello @guilhermeslac
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. Agenda
Introdução
Refatoração e Refatoração em BD
Database Smells e Refatorações
Considerações Finais
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. 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. 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
11. Database Smell
Multi-purpose table
Quando 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 pessoa jurídica
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. 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)
);
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. 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) Database Refactoring:
Split Table
Move Column
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. 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. Table with too many rows
Sugestão(ões) 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ção).
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
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
30. Database Smell
Wrong data type
Tipos de dados possuem uma assinatura, que
descreve as validações mínimas para 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
);
CNPJ, CPF e RG não são números?
VALOR é um campo "flex"
32. Wrong data type
Sugestão(ões) Database Refactoring:
Replace column
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. 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. 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.
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. 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