你试图做一个名为多态关联的设计。也就是说,外键可以引用几个相关表中的任何一个中的行。
但外键约束必须只引用一个表。您不能根据注释表的另一列中的值声明引用不同表的外键。这将违反关系数据库设计的几个规则。
一个更好的解决方案是创建一种由注释引用的“supertable”。
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)
);
您的每个内容类型都将被视为此可重新订阅的子类型。这类似于接口的面向对象的概念。
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)
);
在可以将一行插入BlogPosts或UserPictures之前,必须将一个新行插入到Commentable以生成新的伪键id。然后,您可以在将内容插入到相应的子类型表中时使用生成的ID。
一旦你做了所有这一切,你可以依赖参照完整性约束。