[Agile brazil2014] Bad Smells em Bancos de Dados
-
Upload
ufrgs -
Category
Technology
-
view
210 -
download
3
description
Transcript of [Agile brazil2014] Bad Smells em Bancos de Dados
![Page 1: [Agile brazil2014] Bad Smells em Bancos de Dados](https://reader035.fdocumentos.com/reader035/viewer/2022081513/55957e981a28ab11038b4748/html5/thumbnails/1.jpg)
Bad Smells em Bancos de Dados
@fabriziomello @guilhermeslac
![Page 2: [Agile brazil2014] Bad Smells em Bancos de Dados](https://reader035.fdocumentos.com/reader035/viewer/2022081513/55957e981a28ab11038b4748/html5/thumbnails/2.jpg)
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
![Page 3: [Agile brazil2014] Bad Smells em Bancos de Dados](https://reader035.fdocumentos.com/reader035/viewer/2022081513/55957e981a28ab11038b4748/html5/thumbnails/3.jpg)
Agenda
Introdução
Refatoração e Refatoração em BD
Database Smells e Refatorações
Considerações Finais
![Page 4: [Agile brazil2014] Bad Smells em Bancos de Dados](https://reader035.fdocumentos.com/reader035/viewer/2022081513/55957e981a28ab11038b4748/html5/thumbnails/4.jpg)
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.
![Page 5: [Agile brazil2014] Bad Smells em Bancos de Dados](https://reader035.fdocumentos.com/reader035/viewer/2022081513/55957e981a28ab11038b4748/html5/thumbnails/5.jpg)
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,
...)
![Page 6: [Agile brazil2014] Bad Smells em Bancos de Dados](https://reader035.fdocumentos.com/reader035/viewer/2022081513/55957e981a28ab11038b4748/html5/thumbnails/6.jpg)
Code Smell
“É uma categoria comum de problema no código fonteque indica a necessidade de refatoração.” (Martin Fowler)
![Page 7: [Agile brazil2014] Bad Smells em Bancos de Dados](https://reader035.fdocumentos.com/reader035/viewer/2022081513/55957e981a28ab11038b4748/html5/thumbnails/7.jpg)
Database Smell
“Similarmente aos Code Smells existem problemas comuns em bancos de dados que indicam uma potencial necessidade de refatoração.” (Scott Ambler)
![Page 8: [Agile brazil2014] Bad Smells em Bancos de Dados](https://reader035.fdocumentos.com/reader035/viewer/2022081513/55957e981a28ab11038b4748/html5/thumbnails/8.jpg)
Database Smell
Multi-purpose columnSe 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.
![Page 9: [Agile brazil2014] Bad Smells em Bancos de Dados](https://reader035.fdocumentos.com/reader035/viewer/2022081513/55957e981a28ab11038b4748/html5/thumbnails/9.jpg)
Multi-purpose columnCREATE 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 = nascimentoSe tipo = 'J' então DATA = inicio atividades
![Page 10: [Agile brazil2014] Bad Smells em Bancos de Dados](https://reader035.fdocumentos.com/reader035/viewer/2022081513/55957e981a28ab11038b4748/html5/thumbnails/10.jpg)
Multi-purpose column
Sugestão(ões) Database Refactoring: Split Column Move Column
![Page 11: [Agile brazil2014] Bad Smells em Bancos de Dados](https://reader035.fdocumentos.com/reader035/viewer/2022081513/55957e981a28ab11038b4748/html5/thumbnails/11.jpg)
Database Smell
Multi-purpose tableQuando uma tabela é utilizada para armazenar vários tipos de entidades provavelmente existe uma falha de projeto.
![Page 12: [Agile brazil2014] Bad Smells em Bancos de Dados](https://reader035.fdocumentos.com/reader035/viewer/2022081513/55957e981a28ab11038b4748/html5/thumbnails/12.jpg)
Multi-purpose tableCREATE 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ísicaSe (CPF e RG = NULL) então NOME = razão social pessoa jurídica
![Page 13: [Agile brazil2014] Bad Smells em Bancos de Dados](https://reader035.fdocumentos.com/reader035/viewer/2022081513/55957e981a28ab11038b4748/html5/thumbnails/13.jpg)
Multi-purpose table
Sugestão(ões) Database Refactoring: Split Column Move Column
![Page 14: [Agile brazil2014] Bad Smells em Bancos de Dados](https://reader035.fdocumentos.com/reader035/viewer/2022081513/55957e981a28ab11038b4748/html5/thumbnails/14.jpg)
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.
![Page 15: [Agile brazil2014] Bad Smells em Bancos de Dados](https://reader035.fdocumentos.com/reader035/viewer/2022081513/55957e981a28ab11038b4748/html5/thumbnails/15.jpg)
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));
![Page 16: [Agile brazil2014] Bad Smells em Bancos de Dados](https://reader035.fdocumentos.com/reader035/viewer/2022081513/55957e981a28ab11038b4748/html5/thumbnails/16.jpg)
Redundant data
Sugestão(ões) Database Refactoring: Merge Tables Move Data Drop Column
![Page 17: [Agile brazil2014] Bad Smells em Bancos de Dados](https://reader035.fdocumentos.com/reader035/viewer/2022081513/55957e981a28ab11038b4748/html5/thumbnails/17.jpg)
Database Smell
Tables with too many columnsQuando uma tabela tem muitas colunas é indicativo de falta de coesão, pois está armazenando dados de várias entidades.
![Page 18: [Agile brazil2014] Bad Smells em Bancos de Dados](https://reader035.fdocumentos.com/reader035/viewer/2022081513/55957e981a28ab11038b4748/html5/thumbnails/18.jpg)
Table with too many columnsCREATE 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)
);
![Page 19: [Agile brazil2014] Bad Smells em Bancos de Dados](https://reader035.fdocumentos.com/reader035/viewer/2022081513/55957e981a28ab11038b4748/html5/thumbnails/19.jpg)
Table with too many columnsCREATE 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),
);
![Page 20: [Agile brazil2014] Bad Smells em Bancos de Dados](https://reader035.fdocumentos.com/reader035/viewer/2022081513/55957e981a28ab11038b4748/html5/thumbnails/20.jpg)
Table with too many columns
Sugestão(ões) Database Refactoring: Split Table Move Column
![Page 21: [Agile brazil2014] Bad Smells em Bancos de Dados](https://reader035.fdocumentos.com/reader035/viewer/2022081513/55957e981a28ab11038b4748/html5/thumbnails/21.jpg)
Database Smell
Tables with too many rowsTabelas 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.
![Page 22: [Agile brazil2014] Bad Smells em Bancos de Dados](https://reader035.fdocumentos.com/reader035/viewer/2022081513/55957e981a28ab11038b4748/html5/thumbnails/22.jpg)
Table with too many rowsCREATE 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);
![Page 23: [Agile brazil2014] Bad Smells em Bancos de Dados](https://reader035.fdocumentos.com/reader035/viewer/2022081513/55957e981a28ab11038b4748/html5/thumbnails/23.jpg)
Table with too many rows
Sugestão(ões) Database Refactoring: Split Table Move Rows Move Column
![Page 24: [Agile brazil2014] Bad Smells em Bancos de Dados](https://reader035.fdocumentos.com/reader035/viewer/2022081513/55957e981a28ab11038b4748/html5/thumbnails/24.jpg)
Database Smell
Smart columnsColuna que armazena informações de mais de um contexto (concatenação de informação).
![Page 25: [Agile brazil2014] Bad Smells em Bancos de Dados](https://reader035.fdocumentos.com/reader035/viewer/2022081513/55957e981a28ab11038b4748/html5/thumbnails/25.jpg)
Smart ColumnsCREATE TABLE processo (
numero CHAR(10) PRIMARY KEY,...
);
CREATE TABLE debito (processamento CHAR(15) PRIMARY KEY...
);
numero = 4 digitos ano + 6 digitos sequencialprocessamento = 4 digitos ano + 6 digitos sequencial + 2 digitos parcela + 2
digitos total parcelas + 1 digito verificador
![Page 26: [Agile brazil2014] Bad Smells em Bancos de Dados](https://reader035.fdocumentos.com/reader035/viewer/2022081513/55957e981a28ab11038b4748/html5/thumbnails/26.jpg)
Smart Columns
Sugestão(ões) Database Refactoring: Split Column
![Page 27: [Agile brazil2014] Bad Smells em Bancos de Dados](https://reader035.fdocumentos.com/reader035/viewer/2022081513/55957e981a28ab11038b4748/html5/thumbnails/27.jpg)
Database Smell
Phantom foreign-keyQuando uma coluna em uma tabela pode receber um valor que dependendo de outra coluna estabelece relacionamento de chave estrangeira com outra tabela.
![Page 28: [Agile brazil2014] Bad Smells em Bancos de Dados](https://reader035.fdocumentos.com/reader035/viewer/2022081513/55957e981a28ab11038b4748/html5/thumbnails/28.jpg)
Phantom foreign-key
CREATE TABLE tabela (...tipo INTEGER,codigo INTEGER,...
);
Se TIPO = 1 entao CODIGO é ref. TABELA1Se TIPO = 2 entao CODIGO é ref. TABELA2Se TIPO = 3 entao CODIGO é ref. TABELA3
![Page 29: [Agile brazil2014] Bad Smells em Bancos de Dados](https://reader035.fdocumentos.com/reader035/viewer/2022081513/55957e981a28ab11038b4748/html5/thumbnails/29.jpg)
Phantom foreign-key
Sugestão(ões) Database Refactoring: Introduce new table Introduce table constraint Move column
![Page 30: [Agile brazil2014] Bad Smells em Bancos de Dados](https://reader035.fdocumentos.com/reader035/viewer/2022081513/55957e981a28ab11038b4748/html5/thumbnails/30.jpg)
Database Smell
Wrong data typeTipos de dados possuem uma assinatura, que descreve as validações mínimas para seu uso.
![Page 31: [Agile brazil2014] Bad Smells em Bancos de Dados](https://reader035.fdocumentos.com/reader035/viewer/2022081513/55957e981a28ab11038b4748/html5/thumbnails/31.jpg)
Wrong data typeCREATE 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"
![Page 32: [Agile brazil2014] Bad Smells em Bancos de Dados](https://reader035.fdocumentos.com/reader035/viewer/2022081513/55957e981a28ab11038b4748/html5/thumbnails/32.jpg)
Wrong data type
Sugestão(ões) Database Refactoring: Replace column
![Page 33: [Agile brazil2014] Bad Smells em Bancos de Dados](https://reader035.fdocumentos.com/reader035/viewer/2022081513/55957e981a28ab11038b4748/html5/thumbnails/33.jpg)
Database Smell
Outros smells detectados baseados em experiência (não estão na literatura):
Phantom foreign-key
Wrong data type
Trigger Spaghetti
![Page 34: [Agile brazil2014] Bad Smells em Bancos de Dados](https://reader035.fdocumentos.com/reader035/viewer/2022081513/55957e981a28ab11038b4748/html5/thumbnails/34.jpg)
Database Smell
Fear or changeDentre 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.
![Page 35: [Agile brazil2014] Bad Smells em Bancos de Dados](https://reader035.fdocumentos.com/reader035/viewer/2022081513/55957e981a28ab11038b4748/html5/thumbnails/35.jpg)
Considerações finais
Área com campo vasto a ser explorado
Taxonomia dos Database Smells
Database Smells primitivos e compostos?
Explorar outras formas de detecçãoMétricas, visualização, engenharia reversa, dependência cíclica
Ferramentas de apoio
![Page 36: [Agile brazil2014] Bad Smells em Bancos de Dados](https://reader035.fdocumentos.com/reader035/viewer/2022081513/55957e981a28ab11038b4748/html5/thumbnails/36.jpg)
![Page 37: [Agile brazil2014] Bad Smells em Bancos de Dados](https://reader035.fdocumentos.com/reader035/viewer/2022081513/55957e981a28ab11038b4748/html5/thumbnails/37.jpg)
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
![Page 38: [Agile brazil2014] Bad Smells em Bancos de Dados](https://reader035.fdocumentos.com/reader035/viewer/2022081513/55957e981a28ab11038b4748/html5/thumbnails/38.jpg)
www . c o d i n gb yex amp l e . o rg
www . o rgan i z a ca o v i s u a l . n e t
g u i l h e rmes l a ce rd a@gma i l . c om
@gu i l h e rmes l a c
fa b r i z i ome l l o@gma i l . c om
@fabr i z i ome l l o
Muito Obrigado!