[agile brazil2014] bad smells em bancos de dados

38
Bad Smells em Bancos de Dados @fabriziomello @guilhermeslac

Upload: ufrgs

Post on 03-Jul-2015

210 views

Category:

Technology


3 download

DESCRIPTION

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

TRANSCRIPT

Page 1: [Agile brazil2014] Bad Smells em Bancos de Dados

Bad Smells em Bancos de Dados

@fabriziomello @guilhermeslac

Page 2: [Agile brazil2014] Bad Smells em Bancos de Dados

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

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

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

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

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

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

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

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

Multi-purpose column

Sugestão(ões) Database Refactoring: Split Column Move Column

Page 11: [Agile brazil2014] Bad Smells em Bancos de Dados

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

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

Multi-purpose table

Sugestão(ões) Database Refactoring: Split Column Move Column

Page 14: [Agile brazil2014] Bad Smells em Bancos de Dados

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

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

Redundant data

Sugestão(ões) Database Refactoring: Merge Tables Move Data Drop Column

Page 17: [Agile brazil2014] Bad Smells em Bancos de Dados

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

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

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

Table with too many columns

Sugestão(ões) Database Refactoring: Split Table Move Column

Page 21: [Agile brazil2014] Bad Smells em Bancos de Dados

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

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

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

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

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

Smart Columns

Sugestão(ões) Database Refactoring: Split Column

Page 27: [Agile brazil2014] Bad Smells em Bancos de Dados

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

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

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

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

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

Wrong data type

Sugestão(ões) Database Refactoring: Replace column

Page 33: [Agile brazil2014] Bad Smells em Bancos de Dados

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

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

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
Page 37: [Agile brazil2014] Bad Smells em Bancos de Dados

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

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!