MySQL - 条件外键约束

我的应用中有以下 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)
);

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

完成所有这些后,您就可以依赖参照完整性约束了。

https://stackoverflow.com/questions/2002985/

相关文章:

mysql - 如何在 Sequel Pro 中执行查询?

mysql - 如何解决 "Error: MySQL shutdown unexpectedly"?

mysql - 遇到需要满足多个条件的 MySQL Join 问题

mysql - UNION 和 ORDER BY 的使用不正确?

mysql - MySQL 是否索引 NULL 值?

mysql - 允许所有远程连接,MySQL

mysql - 错误 : select command denied to user '

sql - 单数还是复数数据库表名?

python - MySQL:从查询中获取列名或别名

java - 如何解决无法加载身份验证插件 'caching_sha2_password' 问题