MySQL – 有条件的外键约束

我在我的应用程序中有以下“评论”表:

comments -------- id INT foreign_id INT model TEXT comment_text TEXT ... 

这个表的想法是存储我的应用程序的各个部分的评论 – 它可以存储博客评论意见,即:

 1|34|blogpost|lorem ipsum... 

用户图片:

 2|12|picture|lorem ipsum... 

等等。

现在,有没有办法强制这些数据的外键约束?

即在评论表中这样的东西:

 FOREIGN KEY (`foreign_id`) REFERENCES blogposts (`id`) //but only when model='blogpost' 

你正在试图做一个被称为Polymorphic Associations的devise。 也就是说,外键可以引用几个相关表中的任何一个表中的行。

但是外键约束必须恰好引用一个表。 您不能声明引用不同表的外键,这取决于您的Comments表的另一列中的值。 这将违反关系数据库devise的几个规则。

一个更好的解决办法是制作一种被评论引用的“超级”。

 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) ); 

您的每种内容types都将被视为此超可用的子types。 这类似于界面的面向对象的概念。

 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) ); 

在向BlogPostsUserPictures插入一行之前,您必须向Commentable插入新行以生成新的伪码ID。 然后,可以在将内容插入相应的子types表时使用生成的ID。

一旦你做了这些,你可以依靠参照完整性约束。