Pergunta

Ao criar uma estrutura de banco de dados, quais são as boas diretrizes a serem seguidas ou boas maneiras de determinar até que ponto um banco de dados deve ser normalizado?Você deveria criar um banco de dados não normalizado e dividi-lo à medida que o projeto avança?Você deve criá-lo totalmente normalizado e combinar tabelas conforme necessário para desempenho?

Foi útil?

Solução

Você deseja começar a projetar um banco de dados normalizado até a terceira forma normal.À medida que você desenvolve a camada de lógica de negócios, você pode decidir que precisa desnormalizar um pouco, mas nunca nunca vá abaixo do 3º formulário.Sempre, mantenha o 1º e o 2º formulário em conformidade.Você deseja desnormalizar pela simplicidade do código, não pelo desempenho.Use índices e procedimentos armazenados para isso :)

A razão para não "normalizar à medida que avança" é que você teria que modificar o código que já escreveu sempre que modificar o design do banco de dados.

Existem alguns bons artigos:

http://www.agiledata.org/essays/dataNormalization.html

Outras dicas

@GrizzlyGuru Um homem sábio uma vez me disse "normalize até doer, desnormalize até funcionar".

Ainda não me falhou :)

Não concordo em começar de forma não normalizada, no entanto, na minha experiência, foi mais fácil adaptar seu aplicativo para lidar com um banco de dados menos normalizado do que com um mais normalizado.Também pode levar a situações em que está funcionando "bem o suficiente", de modo que você nunca consegue normalizá-lo (até que seja tarde demais!)

Normalização significa eliminar dados redundantes.Em outras palavras, um banco de dados não normalizado ou desnormalizado é um banco de dados onde a mesma informação será repetida em vários locais diferentes.Isso significa que você precisa escrever instruções de atualização mais complexas para garantir a atualização dos mesmos dados em todos os lugares; caso contrário, você obterá dados inconsistentes, o que, por sua vez, significa que a saída das consultas não é confiável.

Este é um problema enorme, então eu diria que a desnormalização dói, e não o contrário.

Em alguns casos, você pode decidir deliberadamente desnormalizar partes específicas de um banco de dados, se julgar que o benefício supera o trabalho extra na atualização dos dados e o risco de corrupção de dados.Por exemplo, com datawarehouses, onde os dados são agregados por razões de desempenho e os dados muitas vezes não são atualizados após a entrada inicial, o que reduz o risco de inconsistências.

Mas, em geral, esteja cansado de desnormalizar o desempenho.Por exemplo, o benefício de desempenho de uma junção desnormalizada normalmente pode ser alcançado usando visão materializada (também chamado visualização indexada), que será tão rápido quanto consultar uma tabela desnormalizada, mas ainda protege a consistência dos dados.

Jeff tem uma boa visão geral de sua filosofia em seu blog: Talvez a normalização não seja normal.O principal é:não exagere na normalização.Mas acho que um ponto ainda maior a ser retirado é que provavelmente isso não importa muito.A menos que você esteja executando o próximo Google, provavelmente não notará muita diferença até que seu aplicativo cresça.

Considero que a normatização de banco de dados é uma forma de arte.

Você não deseja normalizar demais seu banco de dados porque terá muitas tabelas e isso fará com que suas consultas, mesmo de objetos simples, demorem mais do que deveriam.

Uma boa regra que sigo é normalizar as mesmas informações repetidas continuamente.

Por exemplo, se você estiver criando um aplicativo de gerenciamento de contatos, faria sentido ter Endereço (Rua, Cidade, Estado, CEP, etc.).) como sua própria tabela.

No entanto, se você tiver apenas 2 tipos de contatos, comerciais ou pessoais, precisará de uma tabela de tipos de contato se souber que terá apenas 2?Para mim não.

Eu começaria descobrindo primeiro os tipos de dados que você precisa.Use um programa de modelagem para ajudar, como o Visio.Você não deseja começar com um banco de dados não normalizado porque acabará normalizando.Comece colocando objetos em agrupamentos lógicos, conforme você vê os dados repetidos, leve-os para uma nova tabela.Eu acompanharia esse processo até que você sinta que o banco de dados foi projetado.

Deixe que os testes lhe digam se você precisa combinar tabelas.Uma consulta bem escrita pode cobrir qualquer normalização excessiva.

Acredito que começar com um banco de dados não normalizado e avançar para o normalizado à medida que você avança é geralmente mais fácil de começar.Quanto à questão de até que ponto normalizar, minha filosofia é normalizar até que comece a doer.Isso pode parecer um pouco irreverente, mas geralmente é uma boa maneira de avaliar até onde ir.

Ter um banco de dados normalizado lhe dará mais flexibilidade e manutenção mais fácil.Eu sempre começo com um banco de dados normalizado e depois desnormalizo apenas quando há um problema na vida real que precisa ser resolvido.

Eu vejo isso de forma semelhante ao desempenho do código, ou seja,escreva código sustentável e flexível e comprometa o desempenho ao saber que há um problema de desempenho.

O autor da postagem original nunca descreveu em que situação o banco de dados será utilizado.Se for qualquer tipo de projeto de armazenamento de dados onde em algum momento você precisará de cubos (OLAP) processando dados para algum front-end, seria mais sensato começar com esquema em estrela (tabelas de fatos + dimensão) em vez de olhar para normalização.Os livros de Kimball serão de grande ajuda neste caso.

Concordo que normalmente é melhor começar com um banco de dados normalizado e depois desnormalizar para resolver problemas muito específicos, mas provavelmente começaria com Forma normal de Boyce-Codd em vez da 3ª Forma Normal.

A verdade é que "depende". Depende de muitos fatores, incluindo:

  • Código (codificado manualmente ou acionado por ferramentas (como pacotes ETL))
  • Aplicação primária (processamento de transações, armazenamento de dados, relatórios)
  • Tipo de banco de dados (MySQL, DB/2, Oracle, Netezza, etc.)
  • Arquitetura de banco de dados (tabular, colunar)
  • Qualidade DBA (proativo, reativo, inativo)
  • Qualidade de dados esperada (você deseja impor a qualidade dos dados no nível do aplicativo ou no nível do banco de dados?)

Concordo que você deve normalizar o máximo possível e desnormalizar apenas se for absolutamente necessário para o desempenho.E com visualizações materializadas ou esquemas de cache isso geralmente não é necessário.

O que devemos ter em mente é que, ao normalizar seu modelo, você fornece ao banco de dados mais informações sobre como restringir seus dados para que possa remover o risco de anomalias de atualização que podem ocorrer em modelos incompletamente normalizados.

Se você desnormalizar, precisará conviver com o fato de poder obter anomalias de atualização ou precisará implementar você mesmo a validação de restrição no código do aplicativo.Isso elimina muitos benefícios do uso de um SGBD que permite definir essas restrições de forma declarativa.

Portanto, assumindo a mesma qualidade de código, a desnormalização pode não proporcionar melhor desempenho.

Outra coisa a mencionar é que o hardware é barato hoje em dia, portanto, investir poder de processamento extra no problema costuma ser mais econômico do que aceitar os custos potenciais de limpeza de dados corrompidos.

Freqüentemente, se você normalizar tanto quanto seu outro software permitir, você estará pronto.

Por exemplo, ao usar a tecnologia de mapeamento Objeto-Relacional, você terá um rico conjunto de semântica para vários relacionamentos muitos-para-um e muitos-para-muitos.Nos bastidores, isso fornecerá tabelas de junção com efetivamente 2 chaves primárias.Embora relativamente rara, a verdadeira normalização geralmente fornece relações com 3 ou mais chaves primárias.Em casos como esse, prefiro ficar com o O/R e lançar meu próprio código para evitar as diversas anomalias do banco de dados.

Apenas tente usar o bom senso.

Além disso, alguns dizem - e eu tenho que concordar com eles - que, se você estiver juntando 6 tabelas (o número mágico) na maioria de suas consultas - sem incluir as relacionadas a relatórios -, então você pode considerar desnormalizar um pouco.

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