Ist es akzeptabel, einen Zirkelverweis zwischen zwei Tabellen im Fremdschlüsselfeld zu haben?
Wenn nicht, wie können diese Situationen vermieden werden?
Wenn ja, wie können Daten eingefügt werden?
Nachfolgend finden Sie ein Beispiel dafür, wo (meiner Meinung nach) ein Zirkelverweis akzeptabel wäre:
CREATE TABLE Account
(
ID INT PRIMARY KEY IDENTITY,
Name VARCHAR(50)
)
CREATE TABLE Contact
(
ID INT PRIMARY KEY IDENTITY,
Name VARCHAR(50),
AccountID INT FOREIGN KEY REFERENCES Account(ID)
)
ALTER TABLE Account ADD PrimaryContactID INT FOREIGN KEY REFERENCES Contact(ID)
database-design
foreign-key
rdbms
KidCode
quelle
quelle
Antworten:
Da Sie nullfähige Felder für die Fremdschlüssel verwenden, können Sie tatsächlich ein System erstellen, das so funktioniert, wie Sie es sich vorstellen. Um Zeilen in die Accounts-Tabelle einzufügen, muss in der Contacts-Tabelle eine Zeile vorhanden sein, sofern Sie keine Einfügungen in Accounts mit einer PrimaryContactID von Null zulassen. Um eine Kontaktzeile zu erstellen, ohne dass bereits eine Kontozeile vorhanden ist, müssen Sie zulassen, dass die Spalte "AccountID" in der Tabelle "Kontakte" nullwertfähig ist. Auf diese Weise können Konten keine Kontakte und Kontakte kein Konto haben. Vielleicht ist das wünschenswert, vielleicht auch nicht.
Persönlich würde ich jedoch folgendes Setup bevorzugen:
Dies bietet die Möglichkeit:
IX_AccountsContactsXRef_Primary
bereit. Dieser Index enthält einen Filter, sodass er nur auf Plattformen funktioniert, die diesen unterstützen. Da dieser Index mit derUNIQUE
Option angegeben wird, kann es für jedes Konto immer nur einen einzigen Hauptkontakt geben.Wenn Sie beispielsweise eine Liste aller Kontakte anzeigen möchten, wobei eine Spalte den "primären" Status anzeigt und die primären Kontakte für jedes Konto oben in der Liste angezeigt werden, können Sie Folgendes tun:
Der gefilterte Index verhindert das Einfügen von mehr als einem primären Kontakt pro Konto und bietet gleichzeitig eine schnelle Methode zum Zurückgeben einer Liste primärer Kontakte. Man kann sich leicht eine andere Spalte
IsActive
mit einem nicht eindeutigen gefilterten Index vorstellen , um den Verlauf der Kontakte pro Konto aufrechtzuerhalten, auch wenn dieser Kontakt nicht mehr mit dem Konto verknüpft ist:quelle
Nein, zirkuläre Fremdschlüsselreferenzen sind nicht zulässig. Nicht nur, weil es unmöglich wäre, Daten einzufügen, ohne die Einschränkung ständig zu löschen und neu zu erstellen. aber weil es ein grundlegend fehlerhaftes Modell für jeden Bereich ist, den ich mir vorstellen kann. In Ihrem Beispiel fällt mir keine Domäne ein, in der die Beziehung zwischen Konto und Kontakt nicht NN ist, sodass eine Junction-Tabelle mit FK-Verweisen auf Konto und Kontakt erforderlich ist.
quelle
Sie können Ihr externes Objekt auf den primären Kontakt anstatt auf das Konto verweisen lassen. Ihre Daten würden so aussehen:
quelle