Je suis tombé sur un problème de conception de base de données hors de ma ligue et mon gourou DBA est en train de faire des exercices d'incendie.
En substance, j'ai une table avec la clé primaire suivante (PK pour la brièveté):
child_id integer
parent_id integer
date datetime
child_id
et parent_id
sont des clés étrangères aux tables d'entités. La table "enfant" elle-même contient également une clé étrangère vers la table "parent", et lo, chacune fait child_id
toujours référence à la même chose parent_id
que prévu par le tableau ci-dessus. En fait, il se trouve qu'il y a du code supplémentaire qui maintient les deux synchronisés.
Ce qui fait dire à ce novice trop enthousiaste de la normalisation: «Je devrais plutôt supprimer la redondance!
Je me décompose comme suit:
Table_1 PK:
child_id integer
date datetime
Table_2 PK:
parent_id integer
date datetime
Table_3: (already exists)
child_id integer PRIMARY KEY
parent_id integer FOREIGN KEY
Et voilà, quand je rejoins ces gars ensemble de façon naturelle, je récupère la table d'origine. C'est ma compréhension qui fait ce 5NF.
Cependant, maintenant je me rends compte qu'il existe une règle commerciale cachée.
Normalement, les dates associées à un donné child_id
doivent être un sous-ensemble des dates associées au correspondant parent_id
. Vous pouvez voir que le premier tableau applique cette règle.
Ma décomposition n'applique pas la règle, car vous pouvez ajouter librement au tableau 1 jusqu'à ce que les dates deviennent trop grandes.
Ce qui m'amène ici, avec les questions suivantes:
Cette décomposition est-elle 5NF? Bien que je dirais qu'il permet des anomalies d'insertion, il semble également suivre l'exemple du wiki, qui suit lui-même ce guide . L'expression ( je souligne) "nous pouvons reconstruire tous les faits réels à partir d'une forme normalisée composée de trois types d'enregistrement distincts" me donne une pause spéciale, car peu importe la quantité de déchets dans lesquels je pompe
Table_1
, la jointure naturelle l'ignore toujours.Supposons que je n'aime pas cette décomposition (je n'aime pas). Je reconnais librement que la solution pratique est de laisser la table et le code tels quels. Mais, en théorie, existe-t-il un moyen de décomposer et / ou d'ajouter des contraintes pour que je m'éloigne de la première table et préserve mes règles métier?