Até onde você deve ir com a normalização?

30

Eu tenho uma quantidade decente de dados em um banco de dados. Tenho tabelas bem formadas e boas relações entre elas com alguma redundância em meus dados. Mas até onde devo ir com a normalização? Existem desvantagens de desempenho para muita normalização?

Fergus
fonte

Respostas:

37

Você deve ir tão longe quanto deveria, e não mais longe. Claro. ~ O problema pode ser que isso é um pouco de arte, e é por isso que não é uma ciência pura.

Nosso principal produto é um sistema de análise e relatório e, nesse sentido, temos alguns registros detalhados. Inicialmente, ele foi projetado com muitas junções em um ID comum para alguns dos registros filhos, mas descobrimos que, se desnormalizássemos alguns campos, podíamos cortar MUITAS junções e tirar muitas dores de cabeça de desempenho.

Mas só sabíamos disso porque: 1) criamos um design "normalizado", 2) começamos a usá-lo, 3) criamos o perfil do desempenho real após centenas de milhões de linhas em dezenas de tabelas.

A história final é que, até que apresentássemos o perfil , não sabíamos ao certo o que iria funcionar para nós. Gostamos da ideia de normalizar para que pudéssemos atualizar com mais facilidade, mas no final o desempenho real foi o fator decisivo. Esse é o meu conselho para você: perfil, perfil, perfil.

jcolebrand
fonte
4
arte e não uma ciência me empresta a acreditar que é vodu. Alguma referência?
abel
3
@ Abel, que tal minha anedota em geral? Um criador de perfil pode sugerir regras para desnormalização, mas essas regras vêm de um programador por experiência própria. Toda programação é uma arte. Vou encontrar alguém mais famoso que disse a mesma coisa quando eu chego a um teclado completo mais tarde.
jcolebrand
11
@Abel oh bem, então tudo é in ('forgiven','pardoned');): p
jcolebrand
2
@Fergus feliz que você gostou. Eu sempre achei as anedotas funcionarem melhor.
jcolebrand
2
@abel - 'Uma arte é uma ciência com mais de 7 graus de liberdade'. Além de um certo nível de complexidade, abordagens exaustivas para um problema tornam-se inviáveis. Nesse ponto, abordagens heurísticas baseadas na experiência são mais eficazes. Infelizmente, no campo da computação, esse nível de complexidade é bastante fácil de alcançar em qualquer coisa, menos em sistemas de software triviais.
ConcernedOfTunbridgeWells
10

A normalização é uma meta somente quando ela suporta seu modelo de dados o suficiente para justificá-lo. Ele deve ser um guia para permitir crescimento, gerenciamento e manutenção. Lembre-se de que o livro sobre normalização, nem seu escritor, criará ou manterá seu banco de dados ou seu aplicativo.

Uma boa leitura sobre o assunto "muita normalização" está aqui.

E sim, pode haver impactos no desempenho com muita normalização. Isso ocorreria em uma travessia mais profunda da tabela para selecionar itens como tabelas de indicadores de status quando elas foram puxadas para uma tabela separada. Alguns dirão que isso geralmente é negado na velocidade de atualização (alterando o texto de status de "Bom" para "BOM" ou algo parecido) ou em manutenção.

REW
fonte
2
Aqui está uma boa leitura adicional sobre o assunto e muito mais divertido qntm.org/gay
jcolebrand
5

Recomendo a leitura do apêndice a seguir, encontrado em algumas livros mais recentes Chris Date :

Dois elogios para a normalização

A normalização está longe de ser uma panacéia, como podemos ver facilmente considerando quais são seus objetivos e quão bem ele se compara a eles ...

Devo deixar claro que não quero que meus comentários nesta seção sejam vistos como qualquer tipo de ataque. Acredito firmemente que qualquer coisa menos do que um projeto totalmente normalizado é fortemente contra-indicado ...

um dia quando
fonte
2

Eu acho que é igualmente importante observar as desnormalizações adicionadas explícitas, valores agregados adicionados ou alguns campos de uma tabela mestre copiada para uma cópia detalhada.

O argumento é principalmente algum argumento de desempenho.

Se você aplicar isso, esses campos são atualizados por gatilhos e cabe ao banco de dados mantê-los consistentes.

bernd_k
fonte
2

Eu concordo totalmente com @jcolebrand. Ao projetar o modelo para seu aplicativo, você deve normalizar tudo o que puder. Mas você deve criar um perfil das consultas criadas sobre o seu modelo, especialmente as executadas com frequência.

Minha própria experiência: os atributos que precisaram de duas junções para alcançar (ou seja, três tabelas unidas) serão principalmente prejudiciais ao desempenho. E para piorar as coisas, é usado em transações on-line. Como eu desnormalizo o atributo, ele precisa apenas de uma associação e solicitou ao programador que ajuste o aplicativo para a consulta e atualize o atributo. Agora funciona muito melhor ...

Em outras palavras, você deve equilibrar normalização com desempenho.

Isaac A. Nugroho
fonte