Wie kann diese Datenbank entworfen werden, um zyklische Abhängigkeiten zu vermeiden?

12

Es gibt zwei Tabellen:

  1. Benutzer
  2. 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?

Shashi
quelle
4
Sind Sie sicher, dass ModifiedBy nicht auf den Datenbankbenutzer verweist, der die Änderung vorgenommen hat, sondern auf den Anwendungsbenutzer (der sich in der Benutzertabelle befinden würde)? In jedem Fall spielt es keine Rolle. Ich verstehe nicht, warum es ein tatsächliches Problem gibt.
Philᵀᴹ
Welches wird zuerst erstellt. As CreatedBy ANd Modifiedby ist ein Muss Daten. Und Benutzertabelle sollte nicht als null addressid haben .. Hühnerei-Problem. Wie ich dies lösen, indem Sie eine neue Tabelle UserAddress, die die Referenz für Benutzer-ID und Addressid enthält
Shashi
2
Sie können immer zurückgestellte Einschränkungen verwenden, wenn Ihr DBMS diese unterstützt.
Colin 't Hart
NB Das relationale Modell unterstützt das Ausführen von zwei Einfügungen oder Aktualisierungen als eine atomare Operation. Es ist eine echte Schande, dass dies in SQL nicht unterstützt wird (da zurückgestellte Einschränkungen - obwohl ich sie vorgeschlagen habe - ziemlich schrecklich sind).
Colin 't Hart

Antworten:

7

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

  • Benutzer(UserID) existiert.
  • Die Adresse(AddressID) wurde vom Benutzer erstellt(UserID) .
  • Adresse(AddressID) wurde am Datum erstellt(DateCreated) .
  • Die Adresse(AddressID) wurde zuletzt vom Benutzer(UserID) am Datum geändert (ModifiedOn).
  • Benutzer(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

Bildbeschreibung hier eingeben


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.

Damir Sudarevic
quelle
5

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.

PollusB
quelle
1
Durch das Entfernen der Einschränkungen wird die zyklische Abhängigkeit aus der Definition entfernt, nicht jedoch das Design. Sie können eine Ereignistabelle hinzufügen, um die Benutzer-ID und die Adress-ID aufzuzeichnen, die die Adresse zuletzt erstellt oder geändert haben, die Abhängigkeit jedoch nur einen Schritt weiter entfernt. In umgekehrter Richtung wäre die zyklische Abhängigkeit in einer Tabelle vorhanden, wenn die Benutzertabelle die Spalten CreatedBy und ModifiedBy hätte. Dies ähnelt einer Mitarbeitertabelle mit einer Supervisor-Spalte, in der der Supervisor auch ein Mitarbeiter ist. Wie Phil angedeutet hat - kein Problem.
Leigh Riffel
@LeighRiffel Ich stimme zu. Die von Ihnen vorgeschlagene Ereignistabelle entfernt jedoch tatsächlich alle zyklischen Abhängigkeiten.
ypercubeᵀᴹ
@ypercube In der Tat ist es so; Ich bin mir nicht sicher, wie ich diesen Draht gekreuzt habe. Um klar zu sein, sollten Sie wahrscheinlich keine Ereignistabelle erstellen, obwohl dadurch die zyklische Abhängigkeit entfernt wird.
Leigh Riffel
Wie auch immer, ich glaube nicht, dass diese Antwort das Problem behebt. Die Frage (denke ich) ist, wie man den zyklischen Pfad überhaupt vermeidet und nicht wie man die FKs mit dem zyklischen Pfad überhaupt erstellt.
ypercubeᵀᴹ