Stellen Sie sich die folgende Datenbank vor:
Tabelle 'Firmen' hat Felder ID, Name und Flaggschiff_Produkt_ID. Tabelle 'Produkte' haben Felder ID, Name und Firmen-ID.
Ein Unternehmen muss ein Flaggschiffprodukt (1: 1-Beziehung) haben und alle Produkte haben eine Firma (1: N-Beziehung).
Wenn Sie eine Speicher-Engine wie MyISM verwenden, sollte es kein Problem mit dem obigen Szenario geben. Wenn Sie jedoch eine Engine wie InnoDB verwenden, treten beim Einfügen neuer Daten Probleme auf.
Was ist eine gute Lösung außer dem Erlauben einer NULL-Beziehung für das anfängliche EINFÜGEN?
Um es zusammenzufassen: Eine Firma muss ein one Flaggschiffprodukt haben.
Ich kenne diese spezielle Datenbank-Engine nicht, suche aber nach einer Möglichkeit, die Datenkonsistenzprüfungen oder die referenzielle Integrität während atomarer Einfüge- und Aktualisierungsoperationen vorübergehend zu unterbrechen.
Sie müssen entweder NULLs in Flagship-Produkt zulassen oder überdenken, wie Sie diese Situation modellieren. Ziehen Sie stattdessen in Erwägung, Flaggschiff_Produkt als boolesches Feld auf Produkt zu setzen. Dann haben Sie keine zirkuläre Abhängigkeit. Oder haben Sie ein product_type-Feld auf einem Produkt, das Werte wie FLAGSHIP oder NORMAL oder OBSOLETE oder was auch immer haben könnte. Natürlich muss man das erzwingen, aber in der Vergangenheit habe ich eine sauberere Lösung für dieses Problem gefunden.
Ich empfehle das folgende Datenmodell:
UNTERNEHMEN
PRODUKTE
FLAGSHIP_PRODUCTS
Das Erstellen einer FLAGSHIP-Spalte in der Tabelle PRODUCTS
stellt nicht sicher, dass nur ein Produkt das Flaggschiffprodukt für das jeweilige Unternehmen ist, weil:
Die einzigen Produkte, die intelligent und leistungsfähig genug sind, um mit solchen Situationen richtig umzugehen, sind Systeme, die das Konzept der Mehrfachzuweisung vollständig umsetzen / implementieren.
In dieser Liga gibt es kein einziges SQL-System.
BEARBEITEN
SQL-Systeme haben die Überprüfung von Beschränkungen zurückgestellt, aber die Verwendung kann unordentlich werden.
Hier ist ein Überblick über eine mögliche Problemumgehung. Ich bin mir nicht sicher, wie hoch die Kludge-Skala passt, aber es ist da oben.
Danach, wann immer ein Kunde oder ein Produkt erstellt wird, wenn das richtige referenzierte Produkt / Unternehmen noch nicht erstellt wurde, initialisierten Sie den neuen Artikel so, dass er auf einen Dummy-Pla- cholder verweist. Als nächstes geben Sie diesen Eintrag ein, und Sie vervollständigen durch Aktualisieren des ersten Eintrags.
Der Vorteil ist, dass Sie absolute referentielle Integrität haben, sobald Ihre Datenbankinitialisierungsroutine abgeschlossen ist - und Sie führen diese nur einmal unter vermutlich sehr kontrollierten Umständen aus, also achten Sie genau darauf und stellen Sie sicher, dass es nicht funktioniert. t scheitern! Der Nachteil ist, dass Sie jetzt ein "Extra" -Element in jeder Tabelle haben, das Ihr System durcheinander bringt.
Sie müssen den Zyklus durch verschieben eine Ihrer referenziellen Integritätsbedingungen bis zum Ende der Transaktion unterbrechen.
Bitte googlen Sie nach "INITIALLY DEFERRED DEFERABLE".
(nicht sicher, ob InnoDB dies unterstützt)
Tags und Links database-design circular-dependency