Es gibt zwei Tabellen:
- Benutzer
- Adresse
Benutzer enthält einen Verweis auf Adresse.
Adresse enthält die Spalten CreatedBy und ModifiedBy, die auf Benutzer verweisen.
Wie gestalte ich diese Datenbank, um eine zyklische Abhängigkeit zu vermeiden?
Es gibt zwei Tabellen:
Benutzer enthält einen Verweis auf Adresse.
Adresse enthält die Spalten CreatedBy und ModifiedBy, die auf Benutzer verweisen.
Wie gestalte ich diese Datenbank, um eine zyklische Abhängigkeit zu vermeiden?
Antworten:
Anstatt nach Tipps und Tricks zu suchen (einschließlich aufgeschobener Einschränkungen), würde ich vorschlagen, dass Sie einfach Ihren Weg aus dieser "Referenzsperre" entwerfen - versuchen Sie es also so:
Fakten
(UserID) existiert.(AddressID) wurde vom Benutzer erstellt(UserID) .(AddressID) wurde am Datum erstellt(DateCreated) .(AddressID) wurde zuletzt vom Benutzer(UserID) am Datum geändert (ModifiedOn).(UserID) wohnt bei Adresse(AddressID) seit Datum(ValidFrom) .Einschränkungen
Each Die Adresse wurde vom exactly one Benutzer erstellt . It is possible that more than one Die Adresse wurde vom the same Benutzer erstellt .
Each Adresse wurde am exactly one Datum erstellt . It is possible that more than one Adresse wurde am the same Datum erstellt .
For each Adresse and Datum , that Adresse wurde vom at most one Benutzer am that Datum geändert .
For each Benutzer and Datum , that Benutzer wohnt at most one Adresse seit that Datum .
Logisch

Wenn es um die obligatorische Adresse geht, überprüfen Sie dies auf der Anwendungsebene und verpacken Sie die Ladeanweisungen in eine Transaktion. Auf diese Weise erhalten Sie alles oder nichts.
Sie haben keine andere Wahl, als die zyklische Abhängigkeit in 2 Operationen wie folgt zu erstellen, da beim Erstellen der ersten Tabelle keine Tabelle vorhanden ist.
CREATE TABLE A (A_ID INT PRIMARY KEY, B_FK INT);
CREATE TABLE B (B_ID INT PRIMARY KEY, A_FK INT REFERENCES A(A_ID));
ALTER TABLE A ADD B_FK INT;
Wenn Sie eine zyklische Abhängigkeit vermeiden möchten. Dann müssen Sie eine REFERENCES-Einschränkung entfernen oder Sie können eine DELETE- und UPDATE CASCADE-Referenz auf eine Weise hinzufügen. Sie können auch einen TRIGGER implementieren, wenn Ihre Logik etwas komplex ist.