Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

projeto de banco de dados um-para-muitos-para-muitos


Você deve sempre começar projetando suas tabelas na terceira forma normal (3NF). É bastante aceitável reverter para formas menores (geralmente por motivos de desempenho), desde que você entenda e reduza o impacto, mas comece com 3NF.

A regra (ligeiramente simplificada) a ser lembrada é que cada coluna não chave em uma tabela deve depender de:
  • a chave,
  • toda a chave,
  • e nada além da chave,
  • "me ajude, Codd" - um pouco de humor DBA (e eu quero dizer "pouco").

A primeira pergunta é bastante simples.

Os relacionamentos um-para-muitos são melhor representados como uma chave estrangeira na tabela "muitos". Então o que você propõe é sensato. Ele permite que você restrinja o relacionamento automaticamente. Se você tivesse uma tabela de junção separada (usada para muitos para muitos), precisaria recorrer a "truques" para impor o relacionamento um para muitos.

Quanto à sua segunda pergunta, você precisa olhar para a regra "Codd" acima e pensar:o que exatamente essas linhas em cada tabela representam? Se uma ação de item de trabalho for um objeto distinto de um item de trabalho (eles podem estar relacionados mas, se não estiverem representando o mesmo objeto, são distintos), devem estar em tabelas diferentes.

Além disso, parece que você tem um relacionamento de um para muitos (um item pode ter muitas ações), portanto, eles devem estar em tabelas diferentes apenas por esse motivo.

Quanto à sua consulta sobre as informações redundantes:se elas realmente são redundantes, eles devem ser reparados.

Usando o step_num como exemplo, o que exatamente isso representa? Se for um atributo do item de trabalho, não deveria estar no trabalho ação mesa em tudo.

Você se livraria dele a partir daí e, se quisesse saber o número da etapa de uma linha na tabela de ações de trabalho, juntaria-se à tabela de itens de trabalho usando a chave estrangeira.

Se, em vez disso, for um atributo da ação de trabalho, você deve removê-lo da tabela de itens de trabalho, pois não faz sentido. Você pode ter duas ações, cada uma com um número de etapa diferente, então qual seria o número da etapa do item pai nesse caso?

Claro, você pode ter um distinto número da etapa para ambos os itens e actions - nesse caso, eu consideraria renomear para deixar a intenção clara, algo como item_step_num e action_step_num .

A linha inferior é começar com 3NF. Se em algum momento seu banco de dados estiver muito lento, então considerar a reversão para uma forma menor. Você pode então perguntar a outro questão aqui sobre como reconhecer e mitigar os problemas que surgem a partir disso (por exemplo, a possibilidade de dados inconsistentes em dois lugares, e usar gatilhos para evitar isso).