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中文網其他相關文章!