Top Banner
Bad Smells em Bancos de Dados @fabriziomello @guilhermeslac
38

[Agile brazil2014] Bad Smells em Bancos de Dados

Jul 03, 2015

Download

Technology

Denis Sana

Apresentação sobre bad smells em Banco de Dados que fizemos no AgileBrazil 2014.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
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!