Du försöker göra en design som kallas Polymorfa associationer . Det vill säga, den främmande nyckeln kan referera till rader i vilken som helst av flera relaterade tabeller.
Men en främmande nyckel-begränsning måste referera till exakt en tabell. Du kan inte deklarera en främmande nyckel som refererar till olika tabeller beroende på värdet i en annan kolumn i dina Comments
tabell. Detta skulle bryta mot flera regler för relationsdatabasdesign.
En bättre lösning är att göra en sorts "supertable" som refereras av kommentarerna.
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)
);
Var och en av dina innehållstyper skulle betraktas som en undertyp av denna supertabell. Detta är analogt med det objektorienterade konceptet med ett gränssnitt .
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)
);
Innan du kan infoga en rad i BlogPosts
eller UserPictures
, måste du infoga en ny rad till Commentable
för att generera ett nytt pseudonyckel-id. Sedan kan du använda det genererade ID:t när du infogar innehållet i respektive undertypstabell.
När du väl har gjort allt det kan du lita på referensintegritetsbegränsningar.