DataBase Refactoring em FireBird Autor: Manoel Pimentel Medeiros É Engenheiro de Software, com mais de 15 anos na área de TI, atualmente trabalha com projetos Java pela Rhealeza(SP) e como Coach em metodologias pela Fratech Tecnologia(SP). É Diretor Editorial da Revista Visão Ágil, Possui as certificações CSM e CSP da Scrum Alliance e foi um dos pioneiros na utilização e divulgação de métodos ágeis no Brasil. Contato: visaoagil.wordpress.com
Objetivo Apresentar os conceitos e práticas de refactoring ágil de bancos de dados, que consiste em um método interativo e incremental para aplicar melhorias em banco de dados legados, ou criação de novos bancos dados em um típico projeto de desenvolvimento de software. 2
Qual o problema? Modelo em cascata (waterfall) Planejamento, Análise e Modelagem (Vários Meses) Desenvolvimento (Vários Meses ou Vários Anos) Teste(Dias) Precisa alterar o modelo e agora? Entrega 3
Solução Iterativa e Incremental Iteração 01 (2 a 4 Semanas) (Planejamento, Modelagem, Desenvolvimento, Testes) Incremento de Software Iteração 02 (2 a 4 Semanas) (Planejamento, Modelagem, Desenvolvimento, Testes) Incremento de Software Idéia Abrangente Iteração 03 (2 a 4 Semanas) (Planejamento, Modelagem, Desenvolvimento, Testes) Incremento de Software Iteração 04 (2 a 4 Semanas) (Planejamento, Modelagem, Desenvolvimento, Testes) Incremento de Software 4
Rápido FeedBack Constante inspeção e adaptação. 5
O que é isso? Refactorings É uma forma disciplinada para reestruturar código. A idéia básica é que você faz pequenas alterações ao seu código para melhorar a sua concepção, tornando-a mais fácil de entender e de modificar. Refactoring lhe permite evoluir o seu código ao longo do tempo, para ter uma abordagem iterativa e incremental de programação... Martin Fowler - www.refactoring.com DataBase Refactorings É quando uma simples mudança no esquema de uma base de dados melhora a sua concepção, embora mantendo simultaneamente a sua semântica. Scott W. Ambler - http://www.agiledata.org 6
O que é semâtica? É o estudo do significado lingüístico. Interessa-se pelo que é expresso por sentenças e outros objetos lingüísticos, não pelo arranjo de suas partes sintáticas ou pela sua pronúncia. Resumo: o Conteúdo é mais importante que a forma! 7
Por quê aplicar Refactorings? Aceitar mudanças de escopo Fornecer feedback rápido Melhoria contínua Aumentar a simplicidade para facilitar o entendimento Tornar os modelos mais próximos do mundo real Ter modelos simples para facilitar a manutenção e a evolução de uma aplicação. 8
Cenários Típicos (Inconsistências entre camadas) Notas ID_NOTA (INTEGER) DATA (DATE) LOC_ENT (VARCHAR(80) ID_CLIENTE (INTEGER) Mecanismo de Persistência Vendas - idvenda (Integer) - dataemissao (Date) - localentrega (String) - cliente (Cliente) * *Classe 9
Cenários Típicos (Inconsistências entre domínios) CLIENTES ID NOME CPF 1 MANOEL PIMENTEL 679.679-679-67 2 EMANUEL PIMENTEL 123.123.123-12 3 VITÓRIA PIMENTEL 456.456.456-45 FUNCIONARIOS ID NOME CPF 1 MANOEL PIMENTEL 67967967967 2 EMANUEL PIMENTEL 12312312312 3 VITÓRIA PIMENTEL 45645645645 10
Cenários Típicos (Inconsistências entre termos) FORNECEDORES ID_FORNECEDOR NOME_FORNECEDOR RUA BAIRRO CIDADE ESTADO 1 MANOEL PIMENTEL Fulana de Tal CENTRO São Paulo SP 2 EMANUEL PIMENTEL Presitente Coisa CENTRO São Paulo SP 3 VITÓRIA PIMENTEL General Morto CENTRO São Paulo SP FABRICANTE ID NOME ENDERECO CIDADE UF 1 MANOEL PIMENTEL Fulana de Tal,Centro São Paulo SP 2 EMANUEL PIMENTEL Presitente Coisa,Centro São Paulo SP 3 VITÓRIA PIMENTEL General Morto,Centro São Paulo SP 11
Cenários Típicos (Arqueologia em Aplicações Legadas) T001 C001 C002 C003 C004 C005 1 MANOEL PIMENTEL Fulana de Tal,Centro São Paulo SP 2 EMANUEL PIMENTEL Presitente Coisa,Centro São Paulo SP 3 VITÓRIA PIMENTEL General Morto,Centro São Paulo SP 12
Catálago de SUGESTÕES de Database Refactorings 13
Regra Geral Esquema Original Período de Transição Ex: Backups, Criação de Campos, Cópias de Dados, Remoção de campos antigos Esquema Resultante 14
Structural Refactorings Drop Column Drop Table Drop View Merge Columns Merge Tables Move Column Rename Column Rename Table Rename View Replace Column Split Column São mudanças na estrutura de uma tabela, na coluna ou view. Split Table 15
Exemplo Structural Refactorings Split Column 16
Data Quality Refactorings Add Lookup Table Apply Standard Codes Apply Standard Type Consolidate Key Strategy Drop Column Constraint Drop Default Value Drop Non-Nullable Constraint Introduce Column Constraint Introduce Common Format Make Column Non-Nullable Move Data É uma mudança que melhora e/ou garante a coerência e uso dos valores armazenados no banco de dados. 17
Exemplo Data Quality Refactorings Add Lookup Table 18
Referential Integrity Refactorings Add Foreign Key Constraint Add Trigger for Calculated Column Drop Foreign Key Constraint Introduce Cascading Delete Introduce Hard Delete Introduce Soft Delete Introduce Trigger for History É uma mudança que assegura que existe uma cadeia referenciada dentro de um contexto, de forma que garanta as atualizações e remoções de maneira adequada. (Normalizações) 19
Exemplo Referential Integrity Refactorings Add Foreign Key Constraint Drop Foreign Key Constraint 20
Architectural Refactorings Add Mirror Table Encapsulate Table With View Introduce Calculation Method Introduce Index Introduce Read Only Table Migrate Method From Database Migrate Method to Database Replace Method(s) With View Replace View With Method(s) É uma mudança global que melhora o modo como as camadas externas interagem com uma base de dados. 21
Exemplo Architectural Refactorings Migrate Method From Database 22
Method Refactorings Add Parameter Consolidate Conditional Expression Decompose Conditional Extract Method Introduce Variable Parameterize Methods Remove Parameter Rename Method Reorder Parameters Split Temporary Variable Substitute Algorithm É uma mudança que melhora a qualidade de uma procedure ou função. 23
Exemplo Antes CREATE OR REPLACE FUNCTION GetAccount ( inaccountid IN NUMBER) RETURN NUMBER; AS averagebalance := 0; BEGIN IF inaccountid > 10000 THEN RETURN 0; END IF; IF inaccountid = 123456 THEN RETURN 0; END IF; IF inacountid = 987654 THEN RETURN 0; END IF; -- Code to calculate the average balance RETURN averagebalance; END; Consolidate Conditional Expression Depois CREATE OR REPLACE FUNCTION GetAccount ( inaccountid IN NUMBER) RETURN NUMBER; AS averagebalance := 0; BEGIN IF inaccountid < 10000 inaccountid = 123456 inacountid = 987654 THEN RETURN 0; END IF; -- Code to calculate the average balance RETURN averagebalance; END; 24
Aviso Importante: Organização de SQL SELECT CAMPO1,CAMPO2,CAMPO2,CAMPO3,CAMPO4,SUM(CAMPO5) FROM TABELA1 T1 INNER JOIN TABELA2 T2 ON T1.CAMPO1=T2.CAMPO1 WHERE T2.CAMPO2 LIKE 'A%'GROUP BY CAMPO1,CAMPO2,CAMPO2,CAMPO3,CAMPO4 ORDER BY CAMPO1 select CAMPO1, CAMPO2, CAMPO2, CAMPO3, CAMPO4, SUM(CAMPO5) from TABELA1 T1 inner join TABELA2 T2 on T1.CAMPO1=T2.CAMPO1 where T2.CAMPO2 LIKE 'A%' group by CAMPO1, CAMPO2, CAMPO2, CAMPO3, CAMPO4 order by CAMPO1 25
Questões no FireBird Possilidade do uso de domínios Possibilidade de alterar os charsets e collations Uso de s Derivadas, Views, Functions, Procedures e Triggers Possibilidade de uso de Generators Ferramentas de apoio: IBOConsole e IBUtils. 26
Comparação entre bases Ferramentas: IBOConsole - Para extração dos arquivos de metadata. VIM (VI Improved for Windows) Para comparação entre arquivos 27
Obrigado! visaoagil.wordpress.com 28