Pergunta

Resumo (Desculpe a sua vaga - Acho que se eu entrou em mais detalhes que faria as coisas simplesmente complicar mais)

Eu tenho três tabelas, mesa um contém um ID, mesa dois contém o seu próprio ID e mesa de um ID e mesa de três contém o seu próprio ID e ID de tabela dois.

Eu passei um monte de ponderação tempo e eu acho que seria mais eficiente para a tabela de três a conter também o relacionado queridos tabela id.

-Vai significa que não terá que juntar três tabelas, eu posso apenas consulta de tabela de três (para uma consulta que será usada muito frequentemente)

-Ele me permite implementar um sistema de reservas com mais facilidade apenas por linhas dentro da tabela três que contêm um ID específico de uma tabela de bloqueio.

Para quem quer saber mais sobre o layout de banco de dados há mais informações aqui

Pergunta

O que são os mais desfavorecidos de-normalização? Eu vi algumas pessoas que são completamente contra ela e outros que acreditam na situação certa, é uma ferramenta útil. Do id nunca vai mudar, então eu realmente não vejo nenhuma desvantagem diferente de ter que inserir os mesmos dados duas vezes e, assim, o espaço adicional que vai consumir (que, uma vez que é apenas da id será certamente insignificante).

Foi útil?

Solução

O meu conselho é seguir esta regra geral:. Normalize por padrão, então denormalise se e quando você identificar um problema de desempenho que ele vai resolver

Acho dados e código de lidar com ele, mais fácil e mais lógico para manter normalizado. Eu não acho que haja qualquer problema com desnormalização para melhorar o desempenho, mas eu não especulativamente aplicar qualquer otimização de desempenho que resulta em uma diminuição na capacidade de manutenção até ter certeza de que eles são necessários.

Outras dicas

A única vez que você realmente quer denormalize é se a sua necessária para obter o desempenho desejado

Isso já foi convidado várias vezes. Consulte aqui

Como o próprio um um (Tabela 1) a muitos (Tabela 2), com um outro um (tabela 2) a muitos (Tabela 3) gostaria de manter a mesma estrutura que o seu parece ser 3 camadas lá.

por exemplo.

  • Tabela 1
    • Tabela 2
      • Tabela 3

Além disso, uma grande quantidade vai depender do que campos adicionais que você está armazenando dentro dessas tabelas.

Cada regra pode ser quebrada se houver uma boa razão para isso.

No seu caso eu me pergunto o que os três tabelas contêm. Does Tabela três realmente descrever Table dois ou ele descrever mesa um directamente?

A desvantagem de ter auto-id, tabela de duas-id e mesa-um-id na tabela três, neste caso, é que ele pode levar a inconsistência - que se você tem a tabela-um-id 1 na tabela dois e mesa-um ID 15 na tabela de três por um erro?

Depende dos dados e o relacionamento entre entidades de seus dados. Para mim, seria mais importante ter quaisquer incoerências e ter um pouco mais de tempo na seleção ...

EDIT: Depois de ler sobre suas tabelas gostaria de sugerir para adicionar uma tabela-um-id para a tabela três (áreas), porque a tabela-um-id não muda depois de tudo e por isso sua relativamente salvo por inconsistência.

A normalização vs eficiência é geralmente um trade-off, enquanto normalização geralmente é uma coisa boa, não é uma bala de prata. Se você tem uma razão clara (como parece que você faça), desnormalização é perfeitamente aceitável.

Os esquemas contendo menos de mesas completamente normalizado sofrem do que é chamado de "redundância prejudicial". redundância prejudicial pode resultar em armazenar o mesmo fato em mais de um lugar, ou em não ter qualquer lugar para armazenar um fato que precisa ser armazenado. Estes problemas são conhecidos como "inserção anomalias", "anomalias de atualização", ou "anomalias excluir".

Para fazer uma longa história curta, se você armazenar um fato em mais de um lugar, então mais cedo ou mais tarde você está indo para armazenar fatos contraditórios nos dois lugares, e seu banco de dados vai começar a dar respostas contraditórias, dependendo qual a versão dos fatos a consulta encontrados.

Se você é forçado a "inventar um registro fictício", a fim de ter um lugar para armazenar um fato necessário, então mais cedo ou mais tarde você vai escrever uma consulta que trata equivocadamente o registro fictício como um real.

Se você é um programador super, e você nunca cometer erros, então você não tem que se preocupar com o acima. Eu nunca conheci um tal programador, embora eu já conheci muitas pessoas que pensam que eles nunca cometem erros.

Eu abster-se de "desnormalizar" como uma prática. Isso é como "dirigir longe de Chicago". Você ainda não sabe onde você está indo. No entanto, há momentos em que as regras de normalização devem ser ignoradas, como os outros. Se você está projetando um esquema em estrela (ou um esquema floco de neve), você vai ter de ignorar algumas das regras de normalização, a fim de obter o melhor estrela (ou floco de neve).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top