设置外键约束的常用方法是选择外键指向的表。
我在1个表和一组表之间存在多态关系。
这意味着该表将与集合中的其中一个表有关系。
例如
images: person_id, person_type
subordinates: id, col1, col2...col9
products: id, colA, colB...colZ
在上面的例子中,如果person_type是“subordinates”,那么person_id应该是subordinates.id的外键,而产品也是如此。
所以我想知道,是否有可能在其中一个表中使用外键,或者您必须专门设置在指定表时指向哪个表。
这个问题适用于MySQL和PostgreSQL。
由于
答案 0 :(得分:42)
不,外键约束总是引用一个父表。
这个问题经常出现。以下是我过去的一些答案:
有关多态关联的详情,请参阅我的演示文稿Practical Object-Oriented Models in SQL或我的书SQL Antipatterns: Avoiding the Pitfalls of Database Programming。
答案 1 :(得分:2)
根据定义,外键必须指向一对一表上的主键或候选键 - 仅在原始DBMS中可用。你最好只拥有一个“人”表,并拥有与此相关的表,例如经理信息。
答案 2 :(得分:1)
列只是值的占位符。外键约束意味着存储在该列中的数据只能是与约束中定义的表列匹配的值。外键约束是每个表......
没有什么可以阻止您在列上定义多个外键约束。但这意味着允许存储的唯一值将是已存在于所有其他外部相关表中的值。 IE:TABLE_1具有值1和2,TABLE_2具有值2和3 - TABLE_3具有针对表1和表1定义的外键关系。 2在TABLE_3的col
列上...我可以插入TABLE_3.col
的唯一有效值是2,因为它在两个表中(假设col
不可为空)。
答案 3 :(得分:1)
外键只能指向一个表。
在我看来,你真正想要做的就是在你的人员表中创建一个父ID。下属将有一个父ID指向他们的经理。如果下属需要拥有多个经理,则可以创建一个单独的连接表,其中包含2个列,每个列包含一个人ID,一个是下属,另一个是管理者之一。
如果您想限制哪些人可以分配到parentid字段,可以使用检查约束来完成。