Ich glaube nicht, dass Sie ein Problem mit den Beziehungen haben. Ich denke, stattdessen besteht das Problem darin, dass die resultierende Datenbank durch die Verwendung von Ersatzschlüsseln (dh IDs) für jede Tabelle nicht verhindern kann, dass Mitarbeiter eingefügt werden, deren Abteilung zu einer Firma gehört, während die Klassifizierung zu einer anderen gehört, und umgekehrt. Ein guter Weg, dies zu verstehen, ist die Visualisierung des Schemas mithilfe eines ER-Diagrammtools. Ich werde das Oracle Data Modeler- Tool verwenden, das kostenlos heruntergeladen werden kann.
ER-Diagramm
So wie es aussieht, könnten Sie 2 Firmen haben - sagen wir IBM
und Microsoft
. IBM
kann eine Software Development
Abteilung haben, und Microsoft kann eine Desktop Software
Abteilung haben. IBM kann eine Software Engineer
Klassifizierung haben, und Microsoft kann eine Software Developer
Klassifizierung haben. Nun, da Sie haben einen Ersatzschlüssel für Department
und Classification
die Tatsache , dass Software Development
eine ist IBM
Abteilung und Desktop Software
eine Microsoft
Abteilung für zukünftige Kind - Beziehungen verloren. Dies gilt auch für Classification
. Daher ist es leicht, versehentlich zuzuordnen Harlan Mills
, wer ein IBM
Mitarbeiter in der Software Development
Abteilung ist, dessen Klassifizierung a Software Developer
istMicrosoft
Einstufung! Ebenso könnte der Arbeiter die richtige Klassifizierung und falsche Abteilung erhalten! Hier ist ein Diagramm, das das erste Beispiel zeigt:
Die 1 Ids repräsentieren IBM
und die 2 Ids repräsentieren Microsoft
. Ich habe in rot Szenario hervorgehoben , wo Harlan Mills
und Bill Gates
an den falschen Abteilungen zugeordnet, die kehrt auf die 200 Klassifizierungs - ID und vice zugeordnet durch die 10 - Abteilung Id visualisiert.
Zu lösende Optionen
Also, was sind die Optionen, um sein Geschehen zu verhindern? Es gibt zwei unmittelbare Möglichkeiten. Die erste besteht darin, zu erkennen, dass dieses Problem bei Verwendung eines Ersatzschlüssels für jede Tabelle besteht, und zusätzliche Programmierung einzuführen, um zu überprüfen, ob es nicht auftritt. Dies könnte in der Anwendung geschehen, aber wenn Einfügungen und Aktualisierungen außerhalb der Anwendung erfolgen können, können immer noch falsche Zuordnungen auftreten. Ein besserer Ansatz wäre, einen Auslöser zu erstellen, der beim Einfügen und Aktualisieren eines Mitarbeiters ausgelöst wird, um sicherzustellen, dass die zugewiesene Abteilung zur gleichen Firma gehört wie die zugewiesene Klassifizierung. Wenn dies nicht der Fall ist, wird das Einfügen oder Aktualisieren fehlschlagen.
Die zweite Möglichkeit besteht darin, nicht für jede Tabelle Ersatzschlüssel zu verwenden. Verwenden Sie die Ersatzschlüssel stattdessen nur für die Company
Tabelle, die von grundlegender Bedeutung ist und keine übergeordneten Elemente hat, und erstellen Sie dann identifizierende Beziehungen zu den Tabellen Department
und den Classification
untergeordneten Elementen. Die Tabellen Department
und Classification
haben jetzt eine PK mit dem Company Id
Pluszeichen und eine Sequenznummer oder einen Namen, um sie zu unterscheiden. Dann sind die Beziehungen von Department
undClassification
zu Worker
auch werden identifying
und damit die PK von Worker
wird das Company Id
, plus die Department Number
(ich bin eine Sequenznummer in diesem Beispiel verwendet wird ), sowie die Classification Number
. Das Ergebnis gibt es nur one
Company Id
in der Worker
Tabelle. Es ist jetzt unmöglich , eine zuzuweisenWorker
zu einem Department
in einem Company
und zu einem Classification
in einem anderen Company
.
Warum ist das unmöglich? Dies ist unmöglich, da das Schema die referenzielle Integrität zwischen Worker
und Department
und implementiert Classification
. Wenn versucht wird, ein Worker
für ein Department
in ein Company
und ein Classification
von einem anderen einzufügen , löst die Kombination, die in der entsprechenden übergeordneten Tabelle nicht vorhanden ist, eine Verletzung der referenziellen Integrität aus, und das Einfügen funktioniert nicht.
Hier ist ein aktualisiertes Diagramm einer Implementierung der zweiten Option:
Bevorzugte Option
Von den beiden Optionen bevorzuge ich aus zwei Gründen die zweite - die identifizierenden Beziehungen und die kaskadierenden Schlüssel. Erstens erreicht diese Option die gewünschte Regel ohne zusätzliche Programmierung. Einen Auslöser zu entwickeln ist nicht trivial. Es muss codiert, getestet und gewartet werden. Es ist auch nicht trivial sicherzustellen, dass die Triggerlogik optimal ist, um die Leistung nicht zu beeinträchtigen. Das Buch Angewandte Mathematik für Datenbankprofis enthält viele Details zur Komplexität einer solchen Lösung. Zweitens implizieren die Regeln, dass eine Abteilung und eine Klassifikation nicht außerhalb des Kontexts der existieren können Company
, und daher spiegelt das Schema die reale Welt jetzt genauer wider.
Dies ist eine gute Frage, da sie genau zeigt, warum es eine schlechte Idee ist, einfach anzunehmen, dass jede Tabelle einen Ersatzschlüssel erfordert. auf der physischen Ebene, gerade weil Verknüpfungen erforderlich sind, die bei ordnungsgemäßer Kaskadierung von Schlüsseln unnötig wären. Ein weiteres interessantes Thema, das diese Frage aufzeigt, ist, dass eine Datenbank nicht sicherstellen kann, dass alle darin eingegebenen Daten in Bezug auf die reale Welt korrekt sind. Stattdessen kann es nur sicherstellen, dass die darin eingefügten Daten mit den ihm deklarierten Regeln übereinstimmen. In diesem Fall können wir das bestmögliche tun, indem wir den Cascading-Key-Ansatz verwenden, um sicherzustellen , dass das DBMS die Daten in Bezug auf die Regel konsistent hält, dass einem bestimmten Datenelement zugewiesen werden muss und das DBMS nichts anderes tun kann, als davon auszugehen, dass es angegeben wurde eine wahre Tatsache.Fabian Pascal hat einen ausgezeichneten Blogeintrag zu diesem Thema verfasst, der zeigt, dass ein Ersatzschlüssel nicht nur vom Standpunkt der Datenintegrität aus eine schlechte Idee sein kann, sondern auch einige Abfragen verlangsamtWorker
Company
Classification
und einer Department
von demselbenCompany
. Aber wenn in der realen Welt Microsoft
eine Abteilung angerufen hat, Desktop Software
aber der Benutzer der Datenbank behauptet, die Abteilung sei stattdessenSoftware Development