2010-08-01 41 views
17

設置外鍵約束的常用方法是選擇外鍵指向哪個表。許多表之一的外鍵?

我在1表和一組表之間有一個多態關係。

這意味着該表將與該集合中的其中一個表具有關係。

例如。

images: person_id, person_type 
subordinates: id, col1, col2...col9 
products: id, colA, colB...colZ 

在上面的例子中,如果person_type是「下屬」,那麼爲person_id應該是一個外鍵subordinates.id和同樣的產品。

所以我想知道,是否有可能擁有一個外鍵到多個表中的一個,或者當您指定一個表時,您是否必須專門設置它指向哪個表。

這個問題適用於MySQL和PostgreSQL。

感謝

+0

[你可以在Yii框架中做到這一點](http://www.yiiframework.com/forum/index.php/topic/20018-conditional-relation) – Alireza 2012-12-15 16:03:16

回答

41
+3

哇...你是如何設法找到所有這些鏈接+1! – 2010-08-01 19:25:59

+9

按用戶ID和標籤搜索:'user:20860 [polymorphic-associations]' – 2010-08-01 19:33:03

2

定義外鍵必須指向任何一個和唯一的一臺伯 - 或candidate-鍵 - 主體 - 僅是一個典型的DBMS提供。你最好擁有一張單人桌,並有與之相關的桌子。經理信息。

1

列只是一個值的佔位符。外鍵約束意味着存儲在該列中的數據只能是與約束中定義的表列相匹配的值。外鍵約束是每個表...

沒有什麼可以阻止你在列上定義多個外鍵約束。但這意味着唯一允許存儲的值將是所有其他外部相關表中已存在的值。 IE:TABLE_1的值爲1和2,TABLE_2的值爲2和3 - TABLE_3具有在TABLE_3的col列中定義到表1 & 2的外鍵關係...我可以在TABLE_3.col中插入的唯一有效值是2,因爲它在兩個表(假設col不可爲空)。

1

外鍵只能指向單個表。

它在我看來像你真正想要做的是在你的人表中創建一個父ID。下屬將有一個父母身份指向他們的經理。如果下屬需要多個經理,則可以創建一個單獨的加入表格,其中每個列都包含一個人員ID,其中一個是下屬,另一個是經理之一。

如果你想限制誰可以被分配到parentid字段,這可以通過檢查約束來完成。

+0

MySQL具有但不強制執行CHECK約束。你所描述的仍然是一個外鍵關係,只是對同一個表而言 - 這通常意味着需要遞歸/分級查詢,這是MySQL沒有的(PostgreSQL 8.x)。 – 2010-08-01 19:13:06

+0

這不是我想要做的,我對於我的意思不太清楚。看看我更新的表格和列,你就會明白我在找什麼。 – 2010-08-01 19:27:00

+0

儘管我討厭這種類型的答案,但我在這裏肯定會感覺到「你想要的是錯誤的」。我認爲@Bill Karwin有正確的想法。 – Mykroft 2010-08-01 21:41:00