Bad Smells em Bancos de Dados

38
Bad Smells em Bancos de Dados Fabrízio Mello Guilherme Lacerda @fabriziomello @guilhermeslac

description

Apresentação sobre Bad Smells em Bancos de Dados apresentada dia 06/12/2014 na XPConf-BR em Porto Alegre/RS

Transcript of Bad Smells em Bancos de Dados

Page 1: Bad Smells em Bancos de Dados

Bad Smellsem

Bancos de DadosFabrízio Mello Guilherme Lacerda@fabriziomello @guilhermeslac

Page 2: Bad Smells em Bancos de Dados

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

Page 3: Bad Smells em Bancos de Dados

Agenda

● Refatoração e Código vs Refatoração em Banco

● Dívida Técnica

● Database Smells e Refatorações

● Considerações Finais

Page 4: Bad Smells em Bancos de Dados

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

Page 5: 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 quanto parece:

● além de manter comportamento também é preciso manter informação (dados)

● acoplamento com diversas origens (apps, bds, integrações, 3rd, …)

Page 6: Bad Smells em Bancos de Dados

Code Smell

“É uma categoria comum de problema no código fonte que indica a necessidade de refatoração.” (Martin Fowler)

Page 7: 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: Bad Smells em Bancos de Dados

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.

Page 9: 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: Bad Smells em Bancos de Dados

Multi-purpose column

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

Page 11: Bad Smells em Bancos de Dados

Database Smell

Multi-purpose table

Quanto uma tabela é utilizada para armazenar vários tipos de entidades provavelmente existe uma falha de projeto.

Page 12: 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ísica

Se cpf e rg = NULL então NOME = razão social

Page 13: Bad Smells em Bancos de Dados

Multi-purpose table

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

Page 14: 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, existe risco de ocorrer inconsistências.

Page 15: Bad Smells em Bancos de Dados

Redundant DataCREATE 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: Bad Smells em Bancos de Dados

Redundant Data

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

Page 17: Bad Smells em Bancos de Dados

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.

Page 18: 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: 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: Bad Smells em Bancos de Dados

Table with too many columns

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

Page 21: Bad Smells em Bancos de Dados

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

Page 22: Bad Smells em Bancos de Dados

Table with too many rowsCREATE 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);

Page 23: Bad Smells em Bancos de Dados

Table with too many rows

Sugestão(ões) de Database Refactoring● Split Table● Move Rows● Move Column

Page 24: Bad Smells em Bancos de Dados

Database Smell

Smart columns

Coluna que armazena informações de mais de um contexto (concatenação de informações)

Page 25: 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: Bad Smells em Bancos de Dados

Smart Columns

Sugestão(ões) de Database Refactoring● Split Column

Page 27: Bad Smells em Bancos de Dados

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.

Page 28: Bad Smells em Bancos de Dados

Phantom foreign-keyCREATE 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: Bad Smells em Bancos de Dados

Phantom foreign-key

Sugestão(ões) de Database Refactoring● Introduce new table● Introduce table constraint● Move column

Page 30: Bad Smells em Bancos de Dados

Database Smell

Wrong data type

Tipos de dados possuem uma assinatura, que descreve as validações mínimas para o seu uso.

Page 31: 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

);

Page 32: Bad Smells em Bancos de Dados

Wrong data type

Sugestão(ões) de Database Refactoring● Replace column

Page 33: Bad Smells em Bancos de Dados

Database Smells

Smells que detectados pela minha experiência (não estão na literatura)

● Phantom foreign-key● Wring data-type● Trigger Spaghetti

Page 34: Bad Smells em Bancos de Dados

Database Smells

Fear of changeDentre 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

Page 35: Bad Smells em Bancos de Dados

Considerações Finais

Área com campo vasto a ser explorado● taxonomia dos Database Smells● Database Smells primitivos e

compostosExplorar outras formas de detecção

● métricas, visualização, engenharia reversa, dependência cíclica

Ferramentas de apoio

Page 36: Bad Smells em Bancos de Dados

Dúvidas?

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

Obrigado!Deixe seu feedback aqui:

bit.ly/xp-feedBad Smells em Bancos de Dados

Fabrízio Mello e Guilherme Lacerda

Conferência sobre Extreme Programmingem Porto Alegre, dez/2014.