[英]Foreign key to one of many tables?
設置外鍵約束的常用方法是選擇外鍵將指向哪個表。
我在一個表和一組表之間存在多態關系。
這意味着該表將與集合中的其中一個表有關系。
例如。
images: person_id, person_type
subordinates: id, col1, col2...col9
products: id, colA, colB...colZ
在上面的示例中,如果 person_type 是“subordinates”,那么 person_id 應該是從屬.id 的外鍵,產品也是如此。
所以我想知道,是否有可能對許多表之一有一個外鍵,或者您是否必須在分配一個表時專門設置它指向哪個表。
這個問題適用於 MySQL 和 PostgreSQL。
謝謝
不,外鍵約束總是只引用一個父表。
這個問題經常出現。 以下是我過去的一些答案:
有關多態關聯的更多信息,請參閱我的演講Practical Object-Oriented Models in SQL或我的書SQL Antipatterns, Volume 1: Avoiding the Pitfalls of Database Programming 。
根據定義,外鍵必須指向一個唯一的表上的主鍵或候選鍵 - 僅主鍵在典型的 DBMS 中可用。 您最好擁有一個“人”表,並擁有與此相關的表,例如經理信息。
列只是值的占位符。 外鍵約束意味着存儲在該列中的數據只能是與約束中定義的表列匹配的值。 外鍵約束是每個表...
沒有什么可以阻止您在列上定義多個外鍵約束。 但這意味着唯一允許存儲的值將是所有其他外部相關表中已經存在的值。 IE:TABLE_1 具有值 1 和 2,TABLE_2 具有值 2 和 3 - TABLE_3 具有在 TABLE_3 的col
列上定義到表 1 和 2 的外鍵關系...我可以插入到TABLE_3.col
中的唯一有效值是 2,因為它是在兩個表中(假設col
不可為空)。
外鍵只能指向一個表。
在我看來,您在這里真正想做的是在您的個人表中創建一個父 ID。 下屬將有一個父 ID 指向他們的經理。 如果下屬需要多個經理,則可以創建一個單獨的連接表,其中包含 2 列,每列包含一個人員 ID,一個是下屬,另一個是經理之一。
如果您想限制誰可以分配給 parentid 字段,這可以通過檢查約束來完成。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.