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.
Warum? Sie begründen Ihre Behauptung nicht. – cdmckay