Sie versuchen, ein Design namens Polymorphic Associations zu erstellen . Das heißt, der Fremdschlüssel kann auf Zeilen in einer von mehreren verwandten Tabellen verweisen.
Aber eine Fremdschlüsseleinschränkung muss genau eine Tabelle referenzieren. Sie können keinen Fremdschlüssel deklarieren, der je nach Wert in einer anderen Spalte Ihrer Comments
auf verschiedene Tabellen verweist Tisch. Dies würde gegen mehrere Regeln des Designs relationaler Datenbanken verstoßen.
Eine bessere Lösung besteht darin, eine Art "Supertabelle" zu erstellen, auf die von den Kommentaren verwiesen wird.
CREATE TABLE Commentable (
id SERIAL PRIMARY KEY
);
CREATE TABLE Comments (
comment_id SERIAL PRIMARY KEY,
foreign_id INT NOT NULL,
...
FOREIGN KEY (foreign_id) REFERENCES Commentable(id)
);
Jeder Ihrer Inhaltstypen würde als Untertyp dieser übergeordneten Tabelle betrachtet. Dies ist analog zum objektorientierten Konzept einer Schnittstelle .
CREATE TABLE BlogPosts (
blogpost_id INT PRIMARY KEY, -- notice this is not auto-generated
...
FOREIGN KEY (blogpost_id) REFERENCES Commentable(id)
);
CREATE TABLE UserPictures (
userpicture_id INT PRIMARY KEY, -- notice this is not auto-generated
...
FOREIGN KEY (userpicture_id) REFERENCES Commentable(id)
);
Vorher können Sie eine Zeile in BlogPosts
einfügen oder UserPictures
müssen Sie eine neue Zeile in Commentable
einfügen um eine neue Pseudoschlüssel-ID zu generieren. Dann können Sie diese generierte ID verwenden, wenn Sie den Inhalt in die entsprechende Untertyptabelle einfügen.
Wenn Sie das alles getan haben, können Sie sich auf die Einschränkungen der referenziellen Integrität verlassen.