首页 >数据库 >mysql教程 >如何通过 MySQL 中的多态关联强制引用完整性?

如何通过 MySQL 中的多态关联强制引用完整性?

Barbara Streisand
Barbara Streisand原创
2025-01-16 11:42:58374浏览

How Can I Enforce Referential Integrity with Polymorphic Associations in MySQL?

通过多态关联维护 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_idmodel 的复合主键:

<code class="language-sql">CREATE TABLE Comments ( id INT, foreign_id INT, model TEXT, PRIMARY KEY (id, model) );</code>

这确保了每个 foreign_idmodel 组合的唯一性,但增加了查询的复杂性。 仔细考虑查询设计是必要的。

以上是如何通过 MySQL 中的多态关联强制引用完整性?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn