[agile brazil2014] bad smells em bancos de dados

Post on 03-Jul-2015

210 Views

Category:

Technology

3 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

Bad Smells em Bancos de Dados

@fabriziomello @guilhermeslac

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

Agenda

Introdução

Refatoração e Refatoração em BD

Database Smells e Refatorações

Considerações Finais

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.

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,

...)

Code Smell

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

Database Smell

“Similarmente aos Code Smells existem problemas comuns em bancos de dados que indicam uma potencial necessidade de refatoração.” (Scott Ambler)

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.

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

Multi-purpose column

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

Database Smell

Multi-purpose tableQuando uma tabela é utilizada para armazenar vários tipos de entidades provavelmente existe uma falha de projeto.

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

Multi-purpose table

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

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.

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));

Redundant data

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

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.

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)

);

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),

);

Table with too many columns

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

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.

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);

Table with too many rows

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

Database Smell

Smart columnsColuna que armazena informações de mais de um contexto (concatenação de informação).

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

Smart Columns

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

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.

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

Phantom foreign-key

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

Database Smell

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

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"

Wrong data type

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

Database Smell

Outros smells detectados baseados em experiência (não estão na literatura):

Phantom foreign-key

Wrong data type

Trigger Spaghetti

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.

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

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

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!

top related