Du forsøger at lave et design, der kaldes Polymorfe associationer . Det vil sige, at den fremmede nøgle kan referere til rækker i en hvilken som helst af flere relaterede tabeller.
Men en fremmednøgle-begrænsning skal referere til nøjagtig én tabel. Du kan ikke erklære en fremmednøgle, der refererer til forskellige tabeller afhængigt af værdien i en anden kolonne i dine Comments
bord. Dette ville overtræde adskillige regler for relationel databasedesign.
En bedre løsning er at lave en slags "supertabel", som kommentarerne refererer til.
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)
);
Hver af dine indholdstyper vil blive betragtet som en undertype af denne supertabel. Dette er analogt med det objektorienterede koncept med en grænseflade .
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)
);
Før du kan indsætte en række i BlogPosts
eller UserPictures
, skal du indsætte en ny række til Commentable
for at generere et nyt pseudonøgle-id. Så kan du bruge det genererede id, når du indsætter indholdet i den respektive undertypetabel.
Når du har gjort alt det, kan du stole på referenceintegritetsbegrænsninger.