Quando você deve desnormalizar?

45

Acho que todos estamos familiarizados com a normalização do banco de dados .

Minha pergunta é: Quais são algumas diretrizes que você usa quando deseja desnormalizar as tabelas?

Richard
fonte
3
Os sites StackExchange têm uma vantagem única sobre outros sites na Internet, pois 1) eles permitem que as melhores respostas sejam as mais facilmente encontradas e 2) as melhores respostas são determinadas pela comunidade. Por causa disso, eu acredito que este site e na internet iria beneficiar desta questão, apesar de que tipo de vai contra o FAQ .
Richard
2
possível duplicata de Até onde você deve ir com a normalização?
Jack Douglas
1
Possível duplicado / informações relacionadas Quando desnormalizar banco de dados design
John Sansom

Respostas:

34

Desnormalizar quando são operações OLAP, normalizar quando OLTP (do artigo vinculado na seção Desnormalização)

Os bancos de dados destinados ao processamento de transações on-line (OLTP) geralmente são mais normalizados do que os bancos de dados destinados ao processamento analítico on-line (OLAP). Os aplicativos OLTP são caracterizados por um alto volume de pequenas transações, como a atualização de um registro de vendas em um caixa de supermercado. A expectativa é que cada transação deixe o banco de dados em um estado consistente. Por outro lado, os bancos de dados destinados a operações OLAP são principalmente "lidos principalmente". Os aplicativos OLAP tendem a extrair dados históricos acumulados por um longo período de tempo. Para esses bancos de dados, dados redundantes ou "desnormalizados" podem facilitar os aplicativos de inteligência de negócios. Especificamente, as tabelas dimensionais em um esquema em estrela geralmente contêm dados desnormalizados. Os dados desnormalizados ou redundantes devem ser cuidadosamente controlados durante o processamento de extração, transformação, carregamento (ETL) e os usuários não devem ter permissão para ver os dados até que estejam em um estado consistente. A alternativa normalizada para o esquema em estrela é o esquema de floco de neve. Em muitos casos, a necessidade de desnormalização diminuiu à medida que os computadores e o software RDBMS se tornaram mais poderosos, mas como os volumes de dados geralmente aumentam junto com o desempenho de hardware e software, os bancos de dados OLAP geralmente ainda usam esquemas desnormalizados.

A desnormalização também é usada para melhorar o desempenho em computadores menores, como em caixas registradoras e dispositivos móveis computadorizados, pois esses dados podem usar os dados apenas para consulta (por exemplo, consultas de preços). A desnormalização também pode ser usada quando não existe RDBMS para uma plataforma (como Palm), ou nenhuma alteração deve ser feita nos dados e uma resposta rápida é crucial.

billinkc
fonte
4
Desnormalizo quando estou criando relatórios ou análises e quero resultados rápidos. Todos os índices do mundo com várias junções nunca são tão rápidos quanto uma tabela desnormalizada que representa dados em cache que não serão alterados.
kevinsky
Sucinto e muito útil. Eu tenho trabalhado na periferia do DBA e isso ajuda a fazer muitas coisas circularem.
Jason P Sallinger 8/16
Muitos aplicativos têm bits de requisitos OLAP e OLTP, portanto, todo desenvolvedor de back-end deve aprender como combinar esses dois e como manter os dados desnormalizados atualizados.
JustAMartin 01/09/19
22

Normalize até doer, desnormalize até que funcione (ou seja: o desempenho se torna aceitável) :)

Andrei Rînea
fonte
5
Isso provavelmente não é a melhor resposta, mas é um dos melhores one-liners que eu vi na Stack Overflow :)
Owen
15

Uma razão potencialmente sensata para aplicar a desnormalização controlada é se ela permite aplicar alguma restrição de integridade aos dados que, de outra forma, não seriam possíveis. A maioria dos DBMSs SQL possui suporte extremamente limitado para restrições de várias tabelas. Às vezes, no SQL, a única maneira eficaz de implementar certas restrições é garantir que todos os atributos envolvidos na restrição estejam presentes na mesma tabela - mesmo quando a normalização exigir que eles pertençam a tabelas separadas.

A desnormalização controlada significa que mecanismos são implementados para garantir que inconsistências não possam surgir devido a dados redundantes. O custo desses controles extras e o risco de dados inconsistentes precisam ser considerados ao decidir se a desnormalização vale a pena.

Outro motivo comum para a desnormalização é permitir alguma alteração nas estruturas de armazenamento ou outra otimização física que o DBMS não permitiria. De acordo com o princípio da Independência de Dados Físicos, um SGBD deve ter os meios para configurar estruturas de armazenamento interno sem alterar desnecessariamente a representação lógica dos dados no banco de dados. Infelizmente, muitos DBMSs são muito restritivos às opções de implementação física disponíveis para qualquer esquema de banco de dados. Eles tendem a comprometer a independência do banco de dados físico, suportando apenas uma implementação subótima do modelo lógico desejado.

Deveria ser óbvio, mas ainda precisa ser dito: em todos os casos, são apenas as mudanças nos recursos de implementação física que podem ditar o desempenho - recursos como estruturas de dados internas, arquivos, indexação, hardware e assim por diante. Normalização e desnormalização não têm nada a ver com desempenho ou otimização de armazenamento.

nvogel
fonte
4

Desnormalize se você está acessando com frequência dados computados, conforme sugerido nas respostas a esta pergunta . O custo de armazenamento e manutenção dos dados computados geralmente será menor que o custo de recalculá-los repetidamente se o seu perfil de carga for pesado para leitura.

Nick Chammas
fonte
Observe que isso é especialmente útil se a desnormalização for simplesmente armazenar valores em cache . Para que ainda exista uma coleção normalizada subjacente de tabelas / campos. Ou seja, para cada valor, deve haver uma única célula "principal" mantendo esse valor - sabe-se que outros valores são meramente cópias ou cálculos desse mestre - e, a menos que haja algum benefício forte em fazer o contrário, mantenha todas as células principais em relacionamentos normalizados.
ToolmakerSteve
3

Rotineiramente desnormalizo para que eu possa impor a integridade dos dados com restrições. Um exemplo é uma pergunta recente neste site - replico uma coluna em outra tabela, para que eu possa usar uma restrição CHECK para compará-la com outra coluna. Outro exemplo dessa técnica é o meu post no blog .

Não é possível usar restrições CHECK para comparar colunas em linhas diferentes ou em tabelas diferentes, a menos que você agrupe essa funcionalidade em UDFs escalares invocadas de uma restrição CHECK. E se você realmente precisar comparar colunas em linhas diferentes ou em tabelas diferentes para aplicar uma regra de negócios? Por exemplo, suponha que você saiba o horário de trabalho de um médico e deseja garantir que todas as consultas se ajustem dentro do horário de trabalho? Obviamente, você pode usar um gatilho ou um procedimento armazenado para implementar essa regra de negócios, mas nem um gatilho nem um procedimento armazenado podem garantir 100% de que todos os seus dados estão limpos - alguém pode desativar ou soltar o gatilho, inserir algumas dados sujos e reative ou recrie seu gatilho. Além disso, alguém pode modificar diretamente sua tabela ignorando os procedimentos armazenados.

Deixe-me demonstrar como implementar essa regra de negócios usando apenas restrições FK e CHECK - que garantirão que todos os dados satisfaçam a regra de negócios, desde que todas as restrições sejam confiáveis.

Ainda outro exemplo é uma maneira de impor que períodos de tempo não tenham lacunas e sem sobreposições .

AK
fonte
1
"Eu desnormalizo rotineiramente para poder impor a integridade dos dados com restrições". O mesmo aqui. É uma grande troca: você desnormaliza um pouco, mas ganha DRI .
Nick Chammas 29/03
@ NickChammas - isso é muito interessante. Você pode compartilhar cenários quando faz essas coisas?
AK
1
Certamente. Temos um sistema de atendimento que inclui uma fila de itens a serem atendidos. Há uma Fulfillabletabela com todos os detalhes de cada item que pode ser preenchido e, em seguida, há uma FulfillableQueuetabela que implementa a fila no SQL Server . Somente os cumpríveis com um certo StateIDpodem estar na fila. StateIDestá na Fulfillabletabela, mas eu o replico FulfillableQueuee imponho essa restrição com FOREIGN KEYe CHECKrestrições.
Nick Chammas