Datenbankdesign: Kreisförmige Abhängigkeit

8

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.

    
LiraNuna 07.09.2009, 01:52
quelle

7 Antworten

1

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.

    
Jason Kleban 07.09.2009, 01:55
quelle
5

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.

    
cletus 07.09.2009 01:59
quelle
3

Ich empfehle das folgende Datenmodell:

UNTERNEHMEN

  • COMPANY_ID pk

PRODUKTE

  • PRODUKT_ID (pk)
  • COMPANY_ID (fk)

FLAGSHIP_PRODUCTS

  • COMPANY_ID (pk, fk)
  • PRODUKT_ID (fk)

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:

  • Ein eindeutiger Schlüssel in der Spalte FLAGSHIP erfordert, dass sich die Werte voneinander unterscheiden
  • Eine Check-Einschränkung ist nur eine Liste von akzeptablen Werten
OMG Ponies 07.09.2009 02:07
quelle
2

Warum ein Flaggschiff-Produktfeld nicht in die products-Tabelle als Boolean einfügen ... Sie könnten dies indizieren und companid und haben eine ziemlich schnelle Suche

    
David 07.09.2009 01:58
quelle
1

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.

    
Erwin Smout 08.09.2009 16:48
quelle
0

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.

  • Datenbank erstellen
  • Erstellen Sie Tabellen für Kunden und Produkte
  • Fügen Sie jeweils einen Platzhalter oder eine "Dummy" -Zeile ein, die so konfiguriert sind, dass sie sich gegenseitig referenzieren
  • Richten Sie FK-Einschränkungen zwischen den Tabellen

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.

    
Philip Kelley 08.09.2009 17:11
quelle
0

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)

    
Branko Dimitrijevic 23.05.2011 04:26
quelle