6

Meine Anwendung lädt viele Daten aus einer Datenbank in eine komplexe Datenstruktur. Die In-Memory-Datenstruktur, die die Struktur der Datenbank ressembles, was bedeutet, dass, wenn die Datenbank die folgenden Tabellen enthält:Circular Abhängigkeiten in Fremdschlüsseln: Verwenden Sie es oder vermeiden Sie es?

  • Tabelle A, Schlüssel A1 ist
  • Tabelle B, ist der Schlüssel B1, einer der Säulen C1 ist ein Fremdschlüssel [der Tonart] Tabelle A
  • Tabelle C, ist der Schlüssel, einer der Säulen ist ein Fremdschlüssel zu [der Tonart] Tabelle B

Dann Klassen A I haben, B und C, und:

  • ein Datenelement von B (B :: m_a) ist ein Zeiger auf ein
  • ein Datenelement von C (C :: M_B) ist ein Zeiger

Dies impliziert, dass, wenn nach B I load die Datenbank, die ich in der richtigen Reihenfolge laden muss. Wenn ich zuerst C lade, wird es sich beschweren, dass es den Wert C :: m_b nicht setzen kann, weil die Instanz, auf die es zeigen sollte, nicht geladen wurde.

Problem ist, wenn es auch eine Spalte in A ist, die zu einer der anderen Tabellen ein Fremdschlüssel ist, lassen Sie uns C.

sagen, dass ich durch das Laden alle Fremdschlüssel als Strings das Problem lösen könnte, und führen Sie dann eine Suche nach dem Laden aller Daten, aber da ich manchmal Millionen von Datensätzen laden muss, kann ich es mir nicht leisten, Speicher für diese (wenn auch temporären) Strings zu verwenden.

Nachdem ich über gutes Design gelesen habe (z. B. das Buch "Large Scale C++ Software Design"), scheint es mir eine schlechte Idee zu sein, zirkuläre Referenzen zu haben. Zum Beispiel wenn Datei X.H Y.H enthält, aber Y.H auch X.H enthält, haben Sie wahrscheinlich ein schlechtes Design; Wenn Klasse X von Klasse Y und umgekehrt abhängt, haben Sie wahrscheinlich ein schlechtes Design, das durch Extrahieren dieser Abhängigkeit und Einführung einer dritten Klasse Z gelöst werden sollte, die von X und Y abhängt (X und Y werden nicht mehr voneinander abhängen) .

Ist es eine gute Idee, diese Design-Regel auch auf das Datenbank-Design auszuweiten? Mit anderen Worten: Vermeidung von Zirkelverweisen in Fremdschlüsseln.

Antwort

3

Wenn Sie eine hierarchische Struktur, z. B. einen Organisationsbaum, erstellen, benötigen Sie einen Zirkelverweis nur.

Table Employees 
    EmployeeID <----------| 
    SupervisorEmployeeID ---| 
2

Ja, zyklische Abhängigkeiten in Datenbanken sind eine gute Ausrede, um das Design zu überdenken.

+0

Warum? Sie begründen Ihre Behauptung nicht. – cdmckay

4

Aus einer Datenmodellierung Perspektive gibt es nichts grundlegend "falsch" mit einer circualr Abhängigkeit. Es bedeutet nicht, dass das Modell falsch ist.

Leider können die meisten SQL-DBMS solche Einschränkungen nicht effektiv implementieren, da sie mehrere Tabellenaktualisierungen nicht unterstützen. In der Regel besteht die einzige Möglichkeit darin, eine oder mehrere Abhängigkeiten vorübergehend auszusetzen (z. B. mit einem "verzögerbaren" Fremdschlüssel oder ähnlichen Features) oder das Modell so zu ändern, dass ein Teil der Einschränkung optional wird (eine der referenzierenden Spalten wird in eine neue Tabelle). Dies ist nur ein Workaround für eine fiese Begrenzung von SQL, aber es bedeutet nicht, dass Sie etwas falsch gemacht haben, mit zu beginnen.

2

Sie müssen die Daten modellieren, die Sie haben.Wenn in den Daten eine zirkuläre Beziehung besteht (z. B. jedes Foto gehört zu einem Ordner; aber jeder Ordner hat ein Titelbild), dann ist es korrekt, dies als zirkuläre Beziehung in der Datenbank zu modellieren.

Ich hatte diese Situation nur einmal bei der Verwendung von Oracle, also hatte ich keine Gelegenheit, herauszufinden, wie man eine solche Beziehung in anderen Datenbanken implementiert. Aber für Oracle können Sie meinen Artikel hier lesen:

http://www.databasesandlife.com/circular-dependencies-on-foreign-key-constraints-oracle/

Verwandte Themen