通过多态关联维护 MySQL 中的引用完整性
MySQL 的外键约束对于关系数据库的完整性至关重要。 然而,通过多态关联管理引用完整性(其中单个外键引用多个表)提出了独特的挑战。
多态关系和数据完整性
考虑一个 Comments
表,其中包含与不同应用程序部分(例如博客文章、图像)相关的评论,由 model
列标识。 直接强制执行外键约束,如下所示:
<code class="language-sql">FOREIGN KEY (`foreign_id`) REFERENCES blogposts(`id`)</code>
是不够的,因为它仅针对 blogposts
进行验证,忽略 model
列的值。 MySQL 缺乏对基于列值的条件外键约束的本机支持。
处理多态关联的策略
为了保持多态关系中的数据完整性,请考虑以下替代方案:
1。超级表方法:
创建一个所有内容类型继承自的Commentable
超级表。 然后,每个内容类型表通过外键引用 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) ); 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>
2。复合主键策略:
使用包含 foreign_id
和 model
的复合主键:
<code class="language-sql">CREATE TABLE Comments ( id INT, foreign_id INT, model TEXT, PRIMARY KEY (id, model) );</code>
这确保了每个 foreign_id
和 model
组合的唯一性,但增加了查询的复杂性。 仔细考虑查询设计是必要的。
以上是如何通过 MySQL 中的多态关联强制引用完整性?的详细内容。更多信息请关注PHP中文网其他相关文章!