【问题标题】:Foreign key to one of many tables?许多表之一的外键?
【发布时间】:2011-03-23 22:27:18
【问题描述】:

设置外键约束的常用方法是选择外键指向哪个表。

我在一个表和一组表之间存在多态关系。

这意味着该表将与集合中的其中一个表有关系。

例如。

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

在上面的例子中,如果 person_type 是“subordinates”,那么 person_id 应该是从属.id 的外键,产品也是如此。

所以我想知道,是否可以为多个表之一设置外键,或者您是否必须在分配一个表时专门设置它指向哪个表。

此问题适用于 MySQL 和 PostgreSQL。

谢谢

【问题讨论】:

标签: mysql database postgresql polymorphic-associations


【解决方案1】:

根据定义,外键必须指向一个唯一表上的主键或候选键 - 仅主键在典型 DBMS 中可用。你最好有一个“人”表,并有与此相关的表,例如经理信息。

【讨论】:

    【解决方案2】:

    【讨论】:

    • 按用户ID和标签搜索:user:20860 [polymorphic-associations]
    【解决方案3】:

    一列只是一个值的占位符。外键约束意味着存储在该列中的数据只能是与约束中定义的表列匹配的值。外键约束是每个表...

    没有什么可以阻止您在列上定义多个外键约束。但这意味着允许存储的唯一值将是所有其他外部相关表中已经存在的值。 IE:TABLE_1 具有值 1 和 2,TABLE_2 具有值 2 和 3 - TABLE_3 具有在 TABLE_3 的 col 列上定义到表 1 和 2 的外键关系...我可以插入到 TABLE_3.col 的唯一有效值是 2,因为它在两个表中(假设 col 不可为空)。

    【讨论】:

      【解决方案4】:

      外键只能指向一个表。

      在我看来,您在这里真正想做的是在您的个人表中创建一个父 ID。下属将有一个父 ID 指向他们的经理。如果一个下属需要多个经理,则可以创建一个单独的连接表,其中包含 2 列,每列包含一个人员 ID,一个是下属,另一个是经理之一。

      如果您想限制谁可以分配给 parentid 字段,这可以通过检查约束来完成。

      【讨论】:

      • MySQL 具有但不强制执行 CHECK 约束。您所描述的仍然是外键关系,只是与同一个表 - 这通常意味着需要 MySQL 没有的递归/分层查询(PostgreSQL 8.x 有)。
      • 这不是我想做的,我不太清楚我的意思。看看我更新的表格和列,你就会明白我在寻找什么。
      • 尽管我讨厌这种类型的答案,但我在这里绝对能感觉到“你想要的东西是错的”。我认为@Bill Karwin 的想法是正确的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-05
      • 2015-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多