[Agile brazil2014] Bad Smells em Bancos de Dados

546 visualizações

Publicada em

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

Publicada em: Tecnologia
0 comentários
4 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
546
No SlideShare
0
A partir de incorporações
0
Número de incorporações
5
Ações
Compartilhamentos
0
Downloads
18
Comentários
0
Gostaram
4
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

[Agile brazil2014] Bad Smells em Bancos de Dados

  1. 1. Bad Smells em Bancos de Dados @fabriziomello @guilhermeslac
  2. 2. 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
  3. 3. Agenda  Introdução  Refatoração e Refatoração em BD  Database Smells e Refatorações  Considerações Finais
  4. 4. 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.
  5. 5. 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, ...)
  6. 6. Code Smell “É uma categoria comum de problema no código fonte que indica a necessidade de refatoração.” (Martin Fowler)
  7. 7. Database Smell “Similarmente aos Code Smells existem problemas comuns em bancos de dados que indicam uma potencial necessidade de refatoração.” (Scott Ambler)
  8. 8. 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.
  9. 9. Multi-purpose column CREATE 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 = nascimento Se tipo = 'J' então DATA = inicio atividades
  10. 10. Multi-purpose column Sugestão(ões) Database Refactoring:  Split Column  Move Column
  11. 11. Database Smell Multi-purpose table Quando uma tabela é utilizada para armazenar vários tipos de entidades provavelmente existe uma falha de projeto.
  12. 12. Multi-purpose table CREATE 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 pessoa jurídica
  13. 13. Multi-purpose table Sugestão(ões) Database Refactoring:  Split Column  Move Column
  14. 14. 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.
  15. 15. 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) );
  16. 16. Redundant data Sugestão(ões) Database Refactoring:  Merge Tables  Move Data  Drop Column
  17. 17. Database Smell Tables with too many columns Quando uma tabela tem muitas colunas é indicativo de falta de coesão, pois está armazenando dados de várias entidades.
  18. 18. Table with too many columns CREATE 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) );
  19. 19. Table with too many columns CREATE 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), );
  20. 20. Table with too many columns Sugestão(ões) Database Refactoring:  Split Table  Move Column
  21. 21. Database Smell Tables 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.
  22. 22. Table with too many rows CREATE 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);
  23. 23. Table with too many rows Sugestão(ões) Database Refactoring:  Split Table  Move Rows  Move Column
  24. 24. Database Smell Smart columns Coluna que armazena informações de mais de um contexto (concatenação de informação).
  25. 25. Smart Columns CREATE TABLE processo ( numero CHAR(10) PRIMARY KEY, ... ); CREATE TABLE debito ( processamento CHAR(15) PRIMARY KEY ... ); numero = 4 digitos ano + 6 digitos sequencial processamento = 4 digitos ano + 6 digitos sequencial + 2 digitos parcela + 2 digitos total parcelas + 1 digito verificador
  26. 26. Smart Columns Sugestão(ões) Database Refactoring:  Split Column
  27. 27. 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.
  28. 28. Phantom foreign-key CREATE TABLE tabela ( ... tipo INTEGER, codigo INTEGER, ... ); Se TIPO = 1 entao CODIGO é ref. TABELA1 Se TIPO = 2 entao CODIGO é ref. TABELA2 Se TIPO = 3 entao CODIGO é ref. TABELA3
  29. 29. Phantom foreign-key Sugestão(ões) Database Refactoring:  Introduce new table  Introduce table constraint  Move column
  30. 30. Database Smell Wrong data type Tipos de dados possuem uma assinatura, que descreve as validações mínimas para seu uso.
  31. 31. Wrong data type CREATE 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"
  32. 32. Wrong data type Sugestão(ões) Database Refactoring:  Replace column
  33. 33. Database Smell Outros smells detectados baseados em experiência (não estão na literatura):  Phantom foreign-key  Wrong data type  Trigger Spaghetti
  34. 34. Database Smell Fear or change Dentre 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.
  35. 35. Considerações finais Área com campo vasto a ser explorado Taxonomia dos Database Smells Database Smells primitivos e compostos? Explorar outras formas de detecção Métricas, visualização, engenharia reversa, dependência cíclica Ferramentas de apoio
  36. 36. 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
  37. 37. Muito Obrigado! g u i l h e r mes l a c e rd a@g m a i l . c o m @g u i l h e r mes l a c fa b r i z i o me l l o@g m a i l . c o m @fa b r i z i o me l l o w w w . c o d i n g b y e x a m p l e . o rg w w w . o rg a n i z a c a o v i s u a l . n e t

×