条件外键约束

我在我的应用中有以下'评论'表:

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'

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

但是外键约束必须恰好引用一个表。 您无法声明引用不同表的外键,具体取决于您的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)
);

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

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

链接地址: http://www.djcxy.com/p/70615.html

上一篇: Conditional Foreign Key Constraints

下一篇: Relational Database Design Patterns?