Bad Smells (mal cheiros) em Bancos de Dados

842 visualizações

Publicada em

Bad Smells (mal cheiros) em Bancos de Dados

0 comentários
3 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
842
No SlideShare
0
A partir de incorporações
0
Número de incorporações
12
Ações
Compartilhamentos
0
Downloads
8
Comentários
0
Gostaram
3
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Bad Smells (mal cheiros) em Bancos de Dados

  1. 1. Bad Smells (mal cheiros) em Bancos de Dados timbira A empresa brasileira de PostgreSQL TDC2013, Porto Alegre, 2013-10-26
  2. 2. timbira Palestrante • Fabrízio de Royes Mello • Desenvolvedor PostgreSQL • Líder do PostgreSQL Brasil • Pós-Graduando Uniritter (Agile) • @fabriziomello • http://fabriziomello.blogspot.com • Timbira • Consultor/Mentor/Coach • A empresa brasileira de PostgreSQL • Consultoria • Desenvolvimento • Suporte 24x7 • Treinamento Timbira - A empresa brasileira de PostgreSQL 2 / 39
  3. 3. Sobre este material timbira • esta apresentação está disponível em: http://www.timbira.com.br/material • esta apresentação está sob licença Creative Commons Atribuição 3.0 Brasil: http://www.creativecommons.org/licenses/by/3.0/br • Embora este material tenha sido elaborado com toda precaução, os autores não assumem quaisquer responsabilidades por erros, omissões ou danos resultantes da utilização das informações aqui contidas. • Se você encontrar qualquer erro, por favor reporte-o a contato@timbira.com.br
  4. 4. timbira Resumo 1 Prelúdio 2 Introdução 3 Bad Smells 4 Considerações Finais Timbira - A empresa brasileira de PostgreSQL 1 / 39
  5. 5. Como tudo começou na minha vida... timbira • 1993 - Basic • 1994 - CLIPPER (e um pouco de C) • 1996 - C e Pascal • 1998 - SQL - mudou minha vida ;-) • 1999 - Teoria Relacional • ... • 2004 - Web (PHP, HTML, CSS, Javascript) • ... • 2009 - Database Refactoring • ... • 2013 - Bad Smells em Bancos de Dados Timbira - A empresa brasileira de PostgreSQL 2 / 39
  6. 6. timbira Resumo 1 Prelúdio 2 Introdução 3 Bad Smells 4 Considerações Finais Timbira - A empresa brasileira de PostgreSQL 3 / 39
  7. 7. Bancos de Dados timbira 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. Timbira - A empresa brasileira de PostgreSQL 4 / 39
  8. 8. Refatoração em Bancos de Dados timbira Deterioração + Mudanças em Requisitos = Necessidade de Refatoração. Timbira - A empresa brasileira de PostgreSQL 5 / 39
  9. 9. Refatoração em Bancos de Dados timbira Deterioração + Mudanças em Requisitos = Necessidade de Refatoração. Mas não é tão simples assim: • além de manter comportamento também é preciso manter informação (dados); • acoplamento com diversas origens (apps, bds, integrações, 3rd, ...) Timbira - A empresa brasileira de PostgreSQL 5 / 39
  10. 10. timbira Resumo 1 Prelúdio 2 Introdução 3 Bad Smells 4 Considerações Finais Timbira - A empresa brasileira de PostgreSQL 6 / 39
  11. 11. timbira Code Smell É uma categoria comum de problema no código fonte que indica a necessidade de refatoração. (Martin Fowler) Timbira - A empresa brasileira de PostgreSQL 7 / 39
  12. 12. Database Smell timbira Similarmente aos Code Smells existem problemas comuns em bancos de dados que indicam uma potencial necessidade de refatoração. (Scott Ambler) Timbira - A empresa brasileira de PostgreSQL 8 / 39
  13. 13. Database Smell timbira 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. Timbira - A empresa brasileira de PostgreSQL 9 / 39
  14. 14. Multi-purpose column timbira CREATE TABLE pessoa ( id SERIAL PRIMARY KEY, tipo CHAR(1) CHECK (tipo IN (’F’, ’J’)), nome VARCHAR(100) NOT NULL, data DATE ); Timbira - A empresa brasileira de PostgreSQL 10 / 39
  15. 15. Multi-purpose column timbira 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 Timbira - A empresa brasileira de PostgreSQL 10 / 39
  16. 16. Multi-purpose column timbira Sugestão(ões) Database Refactoring: • Split Column • Move Column Timbira - A empresa brasileira de PostgreSQL 11 / 39
  17. 17. Database Smell timbira Multi-purpose table Quando uma tabela é utilizada para armazenar vários tipos de entidades provavelmente existe uma falha de projeto. Timbira - A empresa brasileira de PostgreSQL 12 / 39
  18. 18. Multi-purpose table timbira CREATE TABLE pessoa ( id SERIAL PRIMARY KEY, tipo CHAR(1) CHECK (tipo IN (’F’, ’J’)), nome VARCHAR(100) NOT NULL, nome_fantasia VARCHAR(100), cnpj CHAR(14), cpf CHAR(11), rg CHAR(10), data DATE ); Timbira - A empresa brasileira de PostgreSQL 13 / 39
  19. 19. Multi-purpose table timbira CREATE TABLE pessoa ( id SERIAL PRIMARY KEY, tipo CHAR(1) CHECK (tipo IN (’F’, ’J’)), nome VARCHAR(100) NOT NULL, nome_fantasia VARCHAR(100), cnpj CHAR(14), cpf CHAR(11), rg CHAR(10), data DATE ); • Se tipo = ’F’ então NOME = nome, • Se tipo = ’J’ então NOME = razão social • Se tipo = ’F’ então CNPJ e NOME_FANTASIA = NULL • Se tipo = ’J’ então CPF e RG = NULL Timbira - A empresa brasileira de PostgreSQL 13 / 39
  20. 20. Multi-purpose table timbira Sugestão(ões) Database Refactoring: • Split Column • Move Column • Split Table Timbira - A empresa brasileira de PostgreSQL 14 / 39
  21. 21. Database Smell timbira 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. Timbira - A empresa brasileira de PostgreSQL 15 / 39
  22. 22. Redundant data timbira CREATE TABLE sys.usuario ( id SERIAL PRIMARY KEY, nome VARCHAR(100) NOT NULL, endereco VARCHAR(100), numero INTEGER, complemento VARCHAR(40) ); CREATE TABLE rh.funcionario ( id SERIAL PRIMARY KEY, nome VARCHAR(100) NOT NULL, endereco VARCHAR(100), numero INTEGER, complemento VARCHAR(40) ); Timbira - A empresa brasileira de PostgreSQL 16 / 39
  23. 23. Redundant data timbira Sugestão(ões) Database Refactoring: • Merge Tables • Move Data • Drop Column Timbira - A empresa brasileira de PostgreSQL 17 / 39
  24. 24. Database Smell timbira 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. Timbira - A empresa brasileira de PostgreSQL 18 / 39
  25. 25. Tables with too many columns timbira 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) ); Timbira - A empresa brasileira de PostgreSQL 19 / 39
  26. 26. Tables with too many columns timbira CREATE TABLE parametro ( parametro1 VARCHAR(100), parametro2 VARCHAR(100), parametro3 VARCHAR(100), parametro4 VARCHAR(100), parametro5 VARCHAR(100), parametro6 VARCHAR(100), ... parametroN VARCHAR(100) ); Timbira - A empresa brasileira de PostgreSQL 20 / 39
  27. 27. Tables with too many columns timbira Sugestão(ões) Database Refactoring: • Split Table • Move Column Timbira - A empresa brasileira de PostgreSQL 21 / 39
  28. 28. Database Smell timbira 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. Timbira - A empresa brasileira de PostgreSQL 22 / 39
  29. 29. Tables with too many rows timbira CREATE TABLE measurement ( city_id int not null, logdate date not null, peaktemp int, unitsales int ); CREATE CREATE ... CREATE CREATE CREATE TABLE measurement_y2006m02 ( ) INHERITS (measurement TABLE measurement_y2006m03 ( ) INHERITS (measurement TABLE measurement_y2007m11 ( ) INHERITS (measurement TABLE measurement_y2007m12 ( ) INHERITS (measurement TABLE measurement_y2008m01 ( ) INHERITS (measurement Timbira - A empresa brasileira de PostgreSQL 23 / 39
  30. 30. Tables with too many rows timbira Sugestão(ões) Database Refactoring: • Split Table • Move Rows • Move Column Timbira - A empresa brasileira de PostgreSQL 24 / 39
  31. 31. Database Smell timbira Smart columns Coluna onde em diferentes posições do dado representam conceitos diferentes. Timbira - A empresa brasileira de PostgreSQL 25 / 39
  32. 32. Smart columns timbira CREATE TABLE processo ( numero CHAR(10) PRIMARY KEY, ... ); CREATE TABLE debito ( processamento CHAR(15) PRIMARY KEY ... ); Timbira - A empresa brasileira de PostgreSQL 26 / 39
  33. 33. Smart columns timbira 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 Timbira - A empresa brasileira de PostgreSQL 26 / 39
  34. 34. Smart columns timbira Sugestão(ões) Database Refactoring: • Split Column Timbira - A empresa brasileira de PostgreSQL 27 / 39
  35. 35. Database Smell timbira 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. Timbira - A empresa brasileira de PostgreSQL 28 / 39
  36. 36. Phantom foreign-key timbira CREATE TABLE tabela ( ... tipo INTEGER, codigo INTEGER, ... ); Timbira - A empresa brasileira de PostgreSQL 29 / 39
  37. 37. Phantom foreign-key timbira 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 • ... Timbira - A empresa brasileira de PostgreSQL 29 / 39
  38. 38. Phantom foreign-key timbira Sugestão(ões) Database Refactoring: • Introduce new table • Introduce table constraint • Move Column Timbira - A empresa brasileira de PostgreSQL 30 / 39
  39. 39. Database Smell timbira Wrong data type Tipos de dados possuem uma assinatura, que descreve as validações mínimas para seu uso. Timbira - A empresa brasileira de PostgreSQL 31 / 39
  40. 40. Wrong data type timbira 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 ); Timbira - A empresa brasileira de PostgreSQL 32 / 39
  41. 41. Wrong data type timbira 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" Timbira - A empresa brasileira de PostgreSQL 32 / 39
  42. 42. Wrong data type timbira Sugestão(ões) Database Refactoring: • Replace column Timbira - A empresa brasileira de PostgreSQL 33 / 39
  43. 43. Database Smell timbira Smells detectados pela minha experiência (não estão na literatura): • Phantom foreign-key • Wrong data type • Trigger Spaghetti Timbira - A empresa brasileira de PostgreSQL 34 / 39
  44. 44. Database Smell timbira Fear of 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. "Lempre-se do valor Coragem do XP!!!!" Timbira - A empresa brasileira de PostgreSQL 35 / 39
  45. 45. timbira Resumo 1 Prelúdio 2 Introdução 3 Bad Smells 4 Considerações Finais Timbira - A empresa brasileira de PostgreSQL 36 / 39
  46. 46. Considerações Finais timbira • Coragem para evoluir • Taxonomia dos Database Smells • Ferramenta para detecção Timbira - A empresa brasileira de PostgreSQL 37 / 39
  47. 47. timbira 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 Timbira - A empresa brasileira de PostgreSQL 38 / 39
  48. 48. timbira Perguntas ? Fabrízio de Royes Mello @fabriziomello fabrizio@timbira.com.br http://www.timbira.com.br http://slideshare.net/fabriziomello Timbira - A empresa brasileira de PostgreSQL 39 / 39

×