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?
database-design
Richard
fonte
fonte
Respostas:
Desnormalizar quando são operações OLAP, normalizar quando OLTP (do artigo vinculado na seção Desnormalização)
fonte
Normalize até doer, desnormalize até que funcione (ou seja: o desempenho se torna aceitável) :)
fonte
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.
fonte
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.
fonte
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 .
fonte
Fulfillable
tabela com todos os detalhes de cada item que pode ser preenchido e, em seguida, há umaFulfillableQueue
tabela que implementa a fila no SQL Server . Somente os cumpríveis com um certoStateID
podem estar na fila.StateID
está naFulfillable
tabela, mas eu o replicoFulfillableQueue
e imponho essa restrição comFOREIGN KEY
eCHECK
restrições.