Oracle
 sql >> Base de données >  >> RDS >> Oracle

conception de base de données un-à-plusieurs-à-plusieurs

Vous devriez toujours commencer par concevoir vos tableaux en troisième forme normale (3NF). Il est tout à fait acceptable de revenir à des formulaires inférieurs (généralement pour des raisons de performances) à condition que vous compreniez et atténuiez l'impact, mais commencez avec 3NF.

La règle (légèrement simplifiée) à retenir est que chaque colonne non clé d'une table doit dépendre de :

  • la clé,
  • la clé entière,
  • et rien que la clé,
  • "Alors aidez-moi, Codd" :un peu d'humour DBA (et je dis bien "un peu").

La première question est assez simple.

Les relations un-à-plusieurs sont mieux représentées par une clé étrangère dans la table "plusieurs". Donc ce que vous proposez est sensé. Il vous permet de restreindre automatiquement la relation. Si vous aviez une table de jointure distincte (utilisée pour plusieurs à plusieurs), vous auriez besoin de recourir à la "ruse" pour appliquer la relation un à plusieurs.

En ce qui concerne votre deuxième question, vous devez consulter la règle "Codd" ci-dessus et vous demander :que représentent exactement ces lignes dans chaque tableau ? Si une action d'élément de travail est un objet distinct d'un élément de travail (ils peuvent être liés mais, s'ils ne représentent pas le même objet, ils sont distincts), ils doivent se trouver dans des tables différentes.

De plus, il semble que vous ayez une relation un-à-plusieurs ici (un élément peut avoir plusieurs actions) donc ils devraient être dans des tables différentes pour cette seule raison.

Quant à votre question sur les informations redondantes :si elles sont vraiment redondants, ils doivent être réparés.

Utilisation du step_num par exemple, qu'est-ce que cela représente exactement? S'il s'agit d'un attribut de l'élément de travail, il ne devrait pas être dans le travail action table du tout.

Vous vous en débarrasseriez à partir de là et, si vous vouliez connaître le numéro d'étape d'une ligne dans la table des actions de travail, vous vous joindriez à la table des éléments de travail à l'aide de la clé étrangère.

S'il s'agit plutôt d'un attribut de l'action de travail, vous devez le supprimer de la table des éléments de travail car cela n'a aucun sens. Vous pourriez avoir deux actions chacune avec un numéro d'étape différent, alors quel serait le numéro d'étape de l'élément parent dans ce cas ?

Bien sûr, vous pouvez avoir un distinct numéro d'étape pour les deux éléments et actions - dans ce cas, j'envisagerais de renommer pour clarifier l'intention, quelque chose comme item_step_num et action_step_num .

L'essentiel est de commencer avec 3NF. Si, à un moment donné, votre base de données fonctionne trop lentement, alors envisager le retour à une forme moindre. Vous pouvez ensuite demander à un autre question ici sur la façon de reconnaître et d'atténuer les problèmes qui en découlent (par exemple, la possibilité de données incohérentes à deux endroits et l'utilisation de déclencheurs pour éviter cela).