2010-08-01 126 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