refactoring data base parte 2
TRANSCRIPT
Refactoring Databases2
Por: Ismael Soares
Agenda
• Objetivo• Dicas e considerações• As categorias de refactoring• Exemplos práticos
Objetivo
Apresentar estratégias de Refactoring Databases e alguns exemplos práticos de cada categoria.
Nenhuma arquitetura deve ser tão rígida a ponto de ser inalterável.
Dicas e considerações
Não se iluda! Pequenas melhorias sempre irão acontecer.
Dicas e considerações
Dicas e considerações
Alterações menores são mais fáceis de aplicar.Implementar uma mudança grande em partes pequenas.Identificar as refactorings de forma individual.
Controlar as alterações fará muita diferença.Criar uma tabela de configuração do banco de dados.Atualização ou sincronização em lote.Escolher um período de depreciação/transição suficiente.Encapsular o acesso ao banco de dados para não duplicar SQLs.
As categorias de Refactoring
1. Estrutural
2. Qualidade dos dados
3. Integridade referencial
4. Arquitetura
5. Métodos
6. Transformação sem refactoring
Estrutural
Drop ColumnDrop TableDrop View Introduce Calculated Column Introduce Surrogate KeyMerge ColumnsMerge TablesMove ColumnRename ColumnRename TableRename ViewReplace Large Object (LOB) With TableReplace ColumnReplace One-to-Many With Associative TableReplace Surrogate Key With Natural KeySplit ColumnSplit Table
Estrutural – problemas comuns
Selects em viewsDefinições de TriggersDefinições de Procedures
Tabelas (foreign key)
Estrutural – problemas comuns
Período de transição
Triggers circulares
CREATE OR REPLACE TRIGGER SynchronizeColunaTabelaToTabela2 BEFORE INSERT OR UPDATE OR DELETE ON TABELA REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW DECLARE BEGIN IF DELETING THEN delete from tabela2 from where id=:new.id; END IF; IF INSERTING THEN jaTemRegisto number := (select distinct 1 from tabela2 where id=:new.id); IF NOT(jaTemRegistro = 1) THEN insert into tabela2(id, coluna) values(:new.id, :new.coluna); END IF; END IF; IF UPDATING THEN IF NOT(:NEW.coluna = :OLD.coluna) THEN IF (:NEW.coluna IS NOT NULl) THEN update tabela2 set coluna = :new.coluna where id= :new.id; END IF; END IF; END IF; END;
Estrutural – problemas comuns
Estrutural – Renomear coluna
Estrutural – Rename Column
Estrutural – Introduce Calculated Column
1. Determine a estratégia de sincronização.2. Determine a seleção que fará parte do calculo.3. Adicione a coluna.4. Implemente a estratégia.
Estrutural – Introduce Calculated Column
Estrutural – Merge Column
Estrutural – Merge Column
Estrutural – Merge Table
Estrutural – Merge Table
Estrutural – Merge Table
Estrutural – Move column
Estrutural – Move column
Qualidade de Dados
Add lookup Table (*)Apply Standard Codes (*)Apply Standard Type (*)Consolidate Key Strategy Drop Column ConstraintDrop Default ValueDrop Non-NullableIntroduce Column Constraint (*)Introduce Common Format (*)Introduce Default ValueMake Column Non-NullableMove Data Replace Type Code With Property Flags
Qualidade de Dados - problemas comuns
1. Constraints fixas quebradas (check constraint).
2. Views com condições fixas na cláusula where.
3. Procedures que usam variavéis fixas para fazer cálculos.
4. Update dos dados (concorrência).
Qualidade de Dados – Add Lookup table
Qualidade de Dados – Apply Standard Codes
Qualidade de Dados – Apply Standard Type
Qualidade de Dados – Introduce Column Constraint
Qualidade de Dados – Introduce Column Format
UPDATE Customer SET PhoneNumber = REPLACE(PhoneNumber,'-',''); UPDATE Customer SET PhoneNumber = REPLACE(PhoneNumber,' ',''); UPDATE Customer SET PhoneNumber = REPLACE(PhoneNumber,'(',''); UPDATE Customer SET PhoneNumber = REPLACE(PhoneNumber,')',''); UPDATE Customer SET PhoneNumber = REPLACE(PhoneNumber,'+1',''); UPDATE Customer SET PhoneNumber = REPLACE(PhoneNumber,'.','');
Integridade referencial
Add Foreign Key Constraint (*)Add Trigger For Calculated Column (*)Drop Foreign Key ConstraintIntroduce Cascading Delete (*)Introduce Hard DeleteIntroduce Soft DeleteIntroduce Trigger For History
Integridade referencial - Add Foreign Key Constraint
Checked immediately
Checked commit
Integridade referencial - Add Trigger For Calculated Column
Integridade referencial - Add Trigger For Calculate Column
Integridade referencial - Introduce Cascading Delete
Cuidado com:DeadlockAccidental mass deletionDuplicated functionality
Integridade referencial - Introduce Cascading Delete
Arquitetura
Add CRUD Methods (*)Add Mirror Table (redundância)Add Read MethodEncapsulate Table With ViewIntroduce Calculation Method (*) Introduce IndexIntroduce Read-Only Table (*)Migrate Method From DatabaseMigrate Method To DatabaseReplace Method(s) With ViewReplace View With Method(s)Use Official Data Source
Arquitetura- Add CRUD Methods
Arquitetura- Introduce Calculation Method
Arquitetura- Introduce Read-Only Table
Arquitetura- Introduce Read-Only Table
Uma trigger para cada tabela
Transformações
Insert DataIntroduce New ColumnIntroduce New TableIntroduce ViewUpdate Data
Bibliografia
Ambler, Scott W., Pramod J. Sadalage (2006). Refactoring Databases: Evolutionary Databases Design. New York: Addison Wesley Professional. http://www.ambysoft.com/books/refactoringDatabases.html Ambler, Scott W., Pramod J. Sadalage (2006). Refactoring Databases: The Process.http://www.simple-talk.com/sql/database-administration/refactoring-databases-the-process/ Ambler, Scott W. (2007). Presentation Databases Refactoring.http://www.infoq.com/presentations/ambler-database-refactoring Ambler, S. W. (2003). Agile Databases Techniques: Effective Strategies for the Agile Software Developer. New York: John Wiley & Sons. www.ambysoft.com/agileDatabasesTechniques.html
Sato, Danilo e Ferreira, João Eduardo (2007). Banco de Dados Ágeis e Refatoração. Curso de Verão 2007 - IME/USP. http://ccsl.ime.usp.br/agilcoop/files/4-BDs-Ageis.pdf
Perguntas
Agradecimentos
Obrigado