透過多態關聯來維護 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中文網其他相關文章!