Vous êtes en essayant de faire un design qui est appelé Polymorphes Associations. C'est la clé étrangère peut faire référence à des lignes dans un de plusieurs tables liées.
Mais une contrainte de clé étrangère doit faire référence à une seule table. Vous ne pouvez pas déclarer une clé étrangère qui fait référence à des tables différentes en fonction de la valeur d'une autre colonne de votre Comments
table. Cela violerait plusieurs règles de base de données relationnelle de la conception.
Une meilleure solution est de faire une sorte de "supertable" qui est référencé par les commentaires.
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)
);
Chacun de vos types de contenu serait considéré comme un sous-type de ce supertable. Ceci est analogue à l'orientée objet concept d'une interface.
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)
);
Avant de vous pouvez insérer une ligne dans BlogPosts
ou UserPictures
, vous devez insérer une nouvelle ligne d' Commentable
pour générer un nouveau pseudokey id. Ensuite, vous pouvez l'utiliser id généré lorsque vous insérez le contenu à chaque sous-type de table.
Une fois que vous faites tout cela, vous pouvez compter sur les contraintes d'intégrité référentielle.