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。这将违反关系数据库设计的一些规则。
更好的解决方案是使注释引用某种“超表”。
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) ); 必须先插入新行才能生成新的伪密钥ID ,然后才能在BlogPosts或中UserPictures插入行Commentable。然后,您可以在将内容插入到相应的子类型表中时使用该生成的ID。
一旦完成所有这些操作,就可以依靠引用完整性约束。来源:stack overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。