我的应用中有以下 comments
表:
comments
--------
id INT
foreign_id INT
model TEXT
comment_text TEXT
...
这个表的想法是为我的应用程序的各个部分存储评论 - 它可以存储博客文章的评论,即:
1|34|blogpost|lorem ipsum...
用户图片:
2|12|picture|lorem ipsum...
等等。
现在,有没有办法强制对此类数据进行 FOREIGN KEY 约束?
即评论表中的类似内容:
FOREIGN KEY (`foreign_id`) REFERENCES blogposts (`id`)
-- but only when model='blogpost'
最佳答案
您正在尝试进行一种称为多态关联的设计。也就是说,外键可以引用多个相关表中的任何一个中的行。
但是外键约束必须只引用一个表。您不能根据 Comments
表的另一列中的值声明引用不同表的外键。这将违反关系数据库设计的几条规则。
更好的解决方案是制作一种注释引用的“ super 表”。
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)
);
您的每个内容类型都将被视为此超表的子类型。这类似于接口(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)
);
在您可以在 BlogPosts
或 UserPictures
中插入一行之前,您必须在 Commentable
中插入一个新行以生成一个新的伪 key ID。然后,您可以在将内容插入相应的子类型表时使用生成的 id。
完成所有这些后,您就可以依赖参照完整性约束了。
https://stackoverflow.com/questions/2002985/