MySQL中的条件外键约束:解决多态关联问题
外键约束通过确保一个表中的值引用另一个相关表中的对应值来强制数据完整性。但是,在某些情况下,表可能需要一个外键,该外键根据条件引用不同的表。这被称为条件外键约束。
在本例中,挑战在于创建一个Comments
表,该表可以存储应用程序各个部分的评论。例如,博客文章和用户图片的评论。理想情况下,Comments
表中foreign_id
的外键约束应该只在model
设置为'blogpost'时应用。
解决方案:多态关联
不幸的是,MySQL 不直接支持条件外键约束。相反,解决方案涉及使用称为多态关联的设计模式。此模式引入一个名为Commentable
的中间表。
<code class="language-sql">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) );</code>
每个内容类型(例如,BlogPost
,UserPicture
)都成为Commentable
的子类型,并通过外键引用它。
<code class="language-sql">CREATE TABLE BlogPosts ( blogpost_id INT PRIMARY KEY, -- 非自增 ... FOREIGN KEY (blogpost_id) REFERENCES Commentable(id) ); CREATE TABLE UserPictures ( userpicture_id INT PRIMARY KEY, -- 非自增 ... FOREIGN KEY (userpicture_id) REFERENCES Commentable(id) );</code>
在向这些子类型表添加数据之前,必须先在Commentable
表中插入新行以生成唯一的ID。然后,此生成的ID用作子类型表中的外键。
通过使用此设计模式,可以强制执行引用完整性约束,确保博客文章的评论只引用博客文章,用户图片的评论只引用用户图片。
以上是如何在 MySQL 中实现多态关联的条件外键约束?的详细内容。更多信息请关注PHP中文网其他相关文章!