Je ne pense pas que vous ayez un problème avec les relations. Je pense plutôt que le problème est qu'en utilisant des clés de substitution (c'est-à-dire des identifiants) pour chaque table, la base de données résultante est incapable d'empêcher les travailleurs d'être insérés dont le département est d'une entreprise tandis que la classification est d'une autre et vice versa. Une bonne façon de comprendre cela est de visualiser le schéma à l'aide d'un outil de création de diagrammes ER. J'utiliserai l' outil Oracle Data Modeler qui est en téléchargement gratuit.
Diagramme ER
Dans l'état actuel des choses, vous pourriez avoir 2 entreprises - dites IBM
et Microsoft
. IBM
peut avoir un Software Development
service et Microsoft peut avoir un Desktop Software
service. IBM peut avoir une Software Engineer
classification et Microsoft peut avoir une Software Developer
classification. Maintenant, parce que vous avez une clé de substitution pour Department
et Classification
, le fait qu'il Software Development
s'agit d'un IBM
département et d' Desktop Software
un Microsoft
département est perdu pour les futures relations avec les enfants. C'est également le cas avec Classification
. Par conséquent, il est facile d'affecter accidentellement Harlan Mills
, qui est un IBM
employé du Software Development
département, une classification Software Developer
dontMicrosoft
classification! De même, le travailleur pourrait recevoir la bonne classification et le mauvais département! Voici un diagramme montrant le premier exemple:
Les 1 Ids représentent IBM
et les 2 Ids représentent Microsoft
. J'ai mis en surbrillance en rouge le scénario où Harlan Mills
et Bill Gates
sont affectés aux mauvais départements, ce qui est visualisé par l'ID de 10 départements associé à l'ID de classification 200 et vice versa.
Options à résoudre
Alors, quelles sont les options pour empêcher qu'il se produise? Il existe deux options immédiates. La première consiste à réaliser qu'en utilisant une clé de substitution pour chaque table, ce problème existe et à introduire une programmation supplémentaire pour vérifier qu'il ne se produit pas. Cela peut être fait dans l'application, mais si des insertions et des mises à jour peuvent se produire en dehors de l'application, des associations incorrectes peuvent toujours se produire. Une meilleure approche serait de créer un déclencheur qui se déclenche lors de l'insertion et de la mise à jour d'un employé pour s'assurer que le service affecté est de la même société que la classification attribuée, et sinon l'échec de l'insertion ou de la mise à jour.
La deuxième option consiste à ne pas utiliser de clés de substitution pour chaque table. Au lieu de cela, utilisez les clés de substitution uniquement pour la Company
table, qui est fondamentale et n'a pas de parents, puis créez des relations d' identification avec les tables enfant Department
et Classification
. Les tables Department
et Classification
ont maintenant un PK de Company Id
plus un numéro de séquence ou un nom pour les distinguer. Ensuite, les relations de Department
et Classification
à Worker
devenir aussi identifying
et donc le PK de Worker
devient le Company Id
, plus le Department Number
(j'utilise un numéro de séquence dans cet exemple), plus le Classification Number
. Le résultat est qu'il n'y a que one
Company Id
dans le Worker
tableau. Il est désormais impossible d'attribuer unWorker
à un Department
dans un Company
et à un Classification
dans un autre Company
.
Pourquoi est-ce impossible? C'est impossible car le schéma implémente l'intégrité référentielle entre Worker
et Department
et Classification
. Si une tentative est faite pour insérer un Worker
pour un Department
dans un Company
et un dans un Classification
autre, la combinaison qui n'existe pas dans la table parent correspondante déclenchera une violation d'intégrité référentielle et l'insertion ne fonctionnera pas.
Voici un schéma mis à jour d'une implémentation de la deuxième option:
Option privilégiée
Des deux options, je préfère absolument la seconde - en utilisant les relations d'identification et les clés en cascade - pour deux raisons. Tout d'abord, cette option atteint la règle souhaitée sans programmation supplémentaire. Développer un déclencheur n'est pas anodin. Il doit être codé, testé et entretenu. Veiller à ce que la logique de déclenchement soit optimale afin de ne pas affecter les performances n'est pas non plus anodin. Le livre Mathématiques appliquées aux professionnels des bases de données fournit de nombreux détails sur la complexité d'une telle solution. Deuxièmement, les règles impliquent qu'un département et une classification ne peuvent pas exister en dehors du contexte de la Company
, et donc le schéma reflète maintenant plus précisément le monde réel.
C'est une excellente question car elle montre exactement pourquoi supposer simplement que chaque table nécessite une clé de substitution est une mauvaise idée. Fabian Pascal a un excellent post blog uniquement sur ce sujet montre que non seulement une clé de substitution peut être une mauvaise idée du point de vue de l' intégrité des données , il peut aussi conduire à rendre des récupérations plus lentesau niveau physique précisément parce que des jointures sont nécessaires qui, si les clés avaient été correctement mises en cascade, seraient inutiles. Un autre sujet intéressant que révèle cette question est qu'une base de données ne peut pas garantir que toutes les données qui y sont insérées sont exactes par rapport au monde réel. Au lieu de cela, il ne peut que garantir que les données qui y sont insérées sont cohérentes avec les règles qui lui sont déclarées. Dans ce cas, nous pouvons faire de notre mieux en utilisant l'approche par clé en cascade pour nous assurer que le SGBD peut garder les données cohérentes par rapport à la règle selon laquelle un Worker
d'un donné Company
doit être affecté d'un Classification
et un Department
de ce même Company
. Mais, si dans le monde réel Microsoft
a un département appelé Desktop Software
mais l'utilisateur de la base de données affirme que le département est à la placeSoftware Development
le SGBD ne peut rien faire d'autre que supposer qu'il a reçu un fait réel.