PROCERGS 2015-03-25: Bad Smells em Bancos de Dados

1.865 visualizações

Publicada em

Apresentação sobre Bad Smells em Bancos de Dados apresentada dia 25/03/2015 na "Quarta-feira do Conhecimento" na PROCERGS (Companhia de Processamento de Dados do Rio Grande do Sul) em Porto Alegre/RS

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

  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
1.865
No SlideShare
0
A partir de incorporações
0
Número de incorporações
990
Ações
Compartilhamentos
0
Downloads
6
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

PROCERGS 2015-03-25: Bad Smells em Bancos de Dados

  1. 1. Bad Smells (mal cheiros) em Bancos de Dados timbira A empresa brasileira de PostgreSQL PROCERGS - Quarta-feira do conhecimento Porto Alegre, 2015-03-25
  2. 2. Palestrante timbira • Fabrízio de Royes Mello • Desenvolvedor PostgreSQL • Líder do PostgreSQL Brasil • Pós-Graduando Uniritter (Agile) • @fabriziomello • http://fabriziomello.github.io • Timbira • Consultor/Mentor/Coach • A empresa brasileira de PostgreSQL • Consultoria • Desenvolvimento • Suporte 24x7 • Treinamento Timbira - A empresa brasileira de PostgreSQL 2 / 42
  3. 3. Sobre este material timbira • esta apresentação está disponível em: http://slideshare.net/fabriziomello • 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. Resumo timbira ..1 Prelúdio ..2 Introdução ..3 Bad Smells ..4 Considerações Finais Timbira - A empresa brasileira de PostgreSQL 1 / 42
  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 • ... • 2015 - Taxonomia Smells em BD Timbira - A empresa brasileira de PostgreSQL 2 / 42
  6. 6. Resumo timbira ..1 Prelúdio ..2 Introdução ..3 Bad Smells ..4 Considerações Finais Timbira - A empresa brasileira de PostgreSQL 3 / 42
  7. 7. Bancos de Dados timbira Tendem a se deteriorar ao longo do tempo. Alguns motivos: Timbira - A empresa brasileira de PostgreSQL 4 / 42
  8. 8. 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 / 42
  9. 9. Refatoração em Bancos de Dados timbira Deterioração + Mudanças em Requisitos = Necessidade de Refatoração. Timbira - A empresa brasileira de PostgreSQL 5 / 42
  10. 10. Refatoração em Bancos de Dados timbira Deterioração + Mudanças em Requisitos = Necessidade de Refatoração. Mas não é tão simples assim, sabem porque? Timbira - A empresa brasileira de PostgreSQL 5 / 42
  11. 11. Refatoração em Bancos de Dados timbira Deterioração + Mudanças em Requisitos = Necessidade de Refatoração. Mas não é tão simples assim, sabem porque? • 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 / 42
  12. 12. Resumo timbira ..1 Prelúdio ..2 Introdução ..3 Bad Smells ..4 Considerações Finais Timbira - A empresa brasileira de PostgreSQL 6 / 42
  13. 13. Code Smell timbira É 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 / 42
  14. 14. 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 / 42
  15. 15. 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 / 42
  16. 16. 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 / 42
  17. 17. 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 / 42
  18. 18. Multi-purpose column timbira Sugestão(ões) Database Refactoring: • Split Column • Move Column Timbira - A empresa brasileira de PostgreSQL 11 / 42
  19. 19. 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 / 42
  20. 20. Multi-purpose table timbira 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), data DATE ); Timbira - A empresa brasileira de PostgreSQL 13 / 42
  21. 21. Multi-purpose table timbira 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), data DATE ); • Se cnpj e nome_fantasia = NULL então NOME = nome pessoa física • Se cpf e rg = NULL então NOME = razão social Timbira - A empresa brasileira de PostgreSQL 13 / 42
  22. 22. Multi-purpose table timbira Sugestão(ões) Database Refactoring: • Move Column • Split Table Timbira - A empresa brasileira de PostgreSQL 14 / 42
  23. 23. Database Smell timbira Redundant data É um problema sério em bases de dados porque quando o dado é armazenado em vários locais, existe risco de ocorrer inconsistência. Timbira - A empresa brasileira de PostgreSQL 15 / 42
  24. 24. 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 / 42
  25. 25. Redundant data timbira Sugestão(ões) Database Refactoring: • Merge Tables • Move Data • Drop Column Timbira - A empresa brasileira de PostgreSQL 17 / 42
  26. 26. 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 / 42
  27. 27. 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 / 42
  28. 28. 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 / 42
  29. 29. Tables with too many columns timbira Sugestão(ões) Database Refactoring: • Split Table • Move Column Timbira - A empresa brasileira de PostgreSQL 21 / 42
  30. 30. 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 / 42
  31. 31. Tables with too many rows timbira CREATE TABLE log ( logtime TIMESTAMP, user_name TEXT, context CHAR(10), message TEXT, detail TEXT ); CREATE TABLE log_201401() INHERITS (log); CREATE TABLE log_201402() INHERITS (log); ... CREATE TABLE log_201503() INHERITS (log); Timbira - A empresa brasileira de PostgreSQL 23 / 42
  32. 32. Tables with too many rows timbira Sugestão(ões) Database Refactoring: • Split Table • Move Rows • Move Column Timbira - A empresa brasileira de PostgreSQL 24 / 42
  33. 33. Tables with too many rows timbira Sugestão(ões) Database Refactoring: • Split Table • Move Rows • Move Column OBS: Em Bancos de Dados Relacionais conhecemos essa técnica como ”Particionamento de Tabelas” Timbira - A empresa brasileira de PostgreSQL 24 / 42
  34. 34. Database Smell timbira Smart columns Coluna que armazena informações de mais de um contexto (concatenação de informações). Timbira - A empresa brasileira de PostgreSQL 25 / 42
  35. 35. 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 / 42
  36. 36. 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 / 42
  37. 37. Smart columns timbira Sugestão(ões) Database Refactoring: • Split Column Timbira - A empresa brasileira de PostgreSQL 27 / 42
  38. 38. 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 / 42
  39. 39. Phantom foreign-key timbira CREATE TABLE tabela ( ... tipo INTEGER, codigo INTEGER, ... ); Timbira - A empresa brasileira de PostgreSQL 29 / 42
  40. 40. 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 / 42
  41. 41. Phantom foreign-key timbira Sugestão(ões) Database Refactoring: • Introduce new table • Introduce table constraint • Move Column Timbira - A empresa brasileira de PostgreSQL 30 / 42
  42. 42. 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 / 42
  43. 43. 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 / 42
  44. 44. 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”, WTF? Timbira - A empresa brasileira de PostgreSQL 32 / 42
  45. 45. Wrong data type timbira Sugestão(ões) Database Refactoring: • Replace column Timbira - A empresa brasileira de PostgreSQL 33 / 42
  46. 46. Database Smell timbira Trigger Spaghetti Quando existe uma trigger em uma tabela A que realiza operações (insert/update/delete) em uma tabela B e esta possui trigger que, dependendo de condições (valores das colunas), faz operações na tabela C, onde também existe outra trigger, que também dependendo de algumas condições faz operações na tabela A, onde de certa forma garante que nao seja gerado um loop infinito. WTF?? Timbira - A empresa brasileira de PostgreSQL 34 / 42
  47. 47. Database Smell timbira Trigger Spaghetti Se você tem isso, saiba que existe um lugarzinho especial reservado pra você ”In the Hell” !!! Sério... NÂO FAÇA ISSO!!!. Timbira - A empresa brasileira de PostgreSQL 35 / 42
  48. 48. Database Smell timbira Smells detectados pela minha experiência (ainda não estão na literatura): • Phantom foreign-key • Wrong data type • Trigger Spaghetti Timbira - A empresa brasileira de PostgreSQL 36 / 42
  49. 49. 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: Timbira - A empresa brasileira de PostgreSQL 37 / 42
  50. 50. 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. Timbira - A empresa brasileira de PostgreSQL 37 / 42
  51. 51. Database Smell timbira Fear of change A solução para esse smell é mais uma questão de postura positiva do time aliada a adoção de boas práticas, tais como: Timbira - A empresa brasileira de PostgreSQL 38 / 42
  52. 52. Database Smell timbira Fear of change A solução para esse smell é mais uma questão de postura positiva do time aliada a adoção de boas práticas, tais como: • database refactoring; • database unit and regression tests; • database continuous integration; • schema versioning. Timbira - A empresa brasileira de PostgreSQL 38 / 42
  53. 53. Resumo timbira ..1 Prelúdio ..2 Introdução ..3 Bad Smells ..4 Considerações Finais Timbira - A empresa brasileira de PostgreSQL 39 / 42
  54. 54. Considerações Finais timbira Á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 Timbira - A empresa brasileira de PostgreSQL 40 / 42
  55. 55. Dúvidas timbira ? Fabrízio de Royes Mello @fabriziomello fabrizio@timbira.com.br fabriziomello@gmail.com http://www.timbira.com.br http://slideshare.net/fabriziomello Timbira - A empresa brasileira de PostgreSQL 41 / 42
  56. 56. Referências timbira • 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 42 / 42

×