O documento discute estratégias para refatoração de bancos de dados. Ele apresenta seis categorias de refatoração - estrutural, qualidade de dados, integridade referencial, arquitetura, métodos - e fornece exemplos de alterações que se encaixam em cada categoria, como renomear tabelas, adicionar chaves estrangeiras e encapsular tabelas em views. O documento também dá orientações gerais para a execução da refatoração.
4. Não
existe
uma
resposta
exata
para
esta
pergunta.
Uma
série
de
fatores
pode
influenciar:
arquitetura,
modelo
de
dados,
quantidades
de
sistemas
externos,
os
relacionamentos
entre
os
objetos
internos
(triggers,
procedures,
functions),
etc.
15. •
Renomear
colunas,
tabelas,
views,
functions
e
procedures;
•
Introduzir
colunas
calculadas
para
melhorar
a
performance
dos
sistemas;
•
Introduzir
surrogate
keys
para
aumentar
a
consistência
dos
dados;
•
Mesclar
colunas
e
tabelas
para
evitar
redundâncias;
•
Mover
coluna
para
outra
tabela;
•
Particionar
tabelas
com
muitas
colunas
para
melhorar
a
coesão
do
esquema
do
banco
de
dados;
•Substituir
associações
um
para
muitos
por
tabelas
associativas
A categoria estrutural engloba mudanças em estruturas como:
17. Exemplo
ALTER TABLE Empregado ADD nome_completo VARCHAR(60);
COMMENT ON Empregado.nome_completo 'Esta coluna irá substituir a coluna nome que será excluída em 20/12/2010';
COMMENT ON Empregado.nome 'Esta coluna foi renomeada para nome_completo
e será excluída em 20/12/2010';
UPDATE Empregado SET nome_completo = nome;
CREATE OR REPLACE TRIGGER SincronizarNomeCompleto
BEFORE INSERT OR UPDATE
ON Empregado
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
DECLARE
BEGIN
IF INSERTING THEN
IF :NEW.nome_completo IS NULL THEN
:NEW.nome_completo := :NEW.nome;
END IF;
IF :NEW.nome IS NULL THEN
:NEW.nome := :NEW.nome_completo;
END IF;
END IF;
IF UPDATING THEN
IF NOT(:NEW.nome_completo =:OLD.nome_completo) THEN
:NEW.nome:=:NEW.nome_completo;
END IF;
IF NOT(:NEW.nome=:OLD.nome) THEN
:NEW.nome_completo:=:NEW.nome;
END IF;
END IF;
END;
/
Em 20/12/2010
DROP TRIGGER SincronizarNomeCompleto;
ALTER TABLE Empregado DROP COLUMN nome;
19. •
Adicionar
tabelas
de
consulta;
•
Padronização
de
siglas;
•
Aplicar
tipos
padrões
para
evitar,
por
exemplo,
que
em
uma
tabela
uma
informação
seja
do
tipo
varchar
e
em
outra
ela
seja
do
tipo
numérico;
•
Adicionar
ou
remover
chaves
estrangeiras;
•
Adicionar
ou
remover
valores
padrões
em
colunas;
•
Mover
dados
de
uma
tabela
para
outra.
As implementações feitas nesta categoria visam melhorar a
qualidade das informações contidas no banco de dados:
21. Exemplo
CREATE TABLE Estado (
estado CHAR(2) NOT NULL,
nome VARCHAR(60),
CONSTRAINT PK_Estado PRIMARY KEY (estado)
);
ALTER TABLE Endereco ADD CONSTRAINT FK_Endereco_estado
FOREIGN KEY (estado) REFERENCES estado;
INSERT INTO Estado (estado)
SELECT DISTINCT UPPER(estado) FROM Endereco;
UPDATE Endereco SET estado = 'TX' WHERE UPPER(estado) ='TX';
UPDATE Estado SET nome = 'Florida' WHERE estado='FL';
UPDATE Estado SET nome = 'Illinois' WHERE estado='IL';
UPDATE Estado SET nome = 'California' WHERE estado='CA';
23. •
Adicionar
ou
remover
chave
estrangeira;
•
Adicionar
trigger
para
coluna
calculada;
•
Adicionar
exclusão
em
cascata;
•
Adicionar
trigger
para
armazenar
em
log
as
alterações.
As implementações feitas nesta categoria visam
garantir a integridade dos dados
27. •
Adicionar
métodos
CRUD
(procedures
para
inserção,
consulta,
atualização
e
exclusão);
•
Adicionar
encapsulamento
à
tabela
através
de
views;
•
Adicionar
métodos
de
cálculos;
•
Adicionar
tabelas
apenas
para
leituras;
•
Migrar
métodos
dos
sistemas
externos
para
o
banco
de
dados.
As implementações feitas nesta categoria visam melhorar de forma
global as interações entre os programas externos e o banco de dados
29. Exemplo
CREATE OR REPLACE PACKAGE EmpregadoCRUD AS
TYPE empregadoType IS REF CURSOR RETURN
Empregado%ROWTYPE;
PROCEDURE obterEmpregado
(empregadoId IN NUMBER,empregadoReturn OUT empregadoType);
PROCEDURE AdicionarEmpregado(....);
PROCEDURE AtualizarEmpregado(....);
PROCEDURE ExcluirEmpregado(....);
END EmpregadoCRUD; /
CREATE OR REPLACE PACKAGE BODY EmpregadoCRUD AS
PROCEDURE obterEmpregado
(empregadoId IN NUMBER, empregadoReturn OUT
empregadoType) IS
BEGIN
OPEN refEmpregado FOR
SELECT * FROM Empregado WHERE empregadoId =
empregadoId;
END obterEmpregado;
END EmpregadoCRUD;/
31. •
Adicionar
ou
remover
parâmetros
dos
métodos;
•
Renomear
métodos;
•
Reordenar
os
parâmetros
dos
métodos;
•
Substituir
vários
métodos
por
um
método
genérico;
•
Substituir
um
método
genérico
por
vários
outros
métodos.
Como o próprio nome sugere, as refatorações desta categoria têm por objetivo
melhorar a qualidade de stored procedures, triggers ou funções armazenadas no
banco de dados