代码之家  ›  专栏  ›  技术社区  ›  dangerousdave

使用外键引用两个或多个表是个好主意吗?

  •  0
  • dangerousdave  · 技术社区  · 14 年前

    rubyonrails-ORM(object-relational-mapping)有一个称为多态关联的东西,允许外键引用2个或更多其他表。这是通过创建一个名为“type”的附加列来实现的,该列指定与外键关联的表。

    从数据库的角度来看,这个实现是否有一个名称?这是好的还是坏的做法?

    谢谢

    2 回复  |  直到 14 年前
        1
  •  1
  •   Tate Johnson    14 年前

    是的,使用多个键引用一个唯一的记录称为复合键。这种做法是好是坏取决于您的数据库模式。

    假设我们有4张桌子: A , B C Z Z轴 维护对的引用 , B类 ,和 C级 Z轴 .

    我们需要一个列来存储每个表的引用。这意味着对于未使用的列,我们将得到空值。将来,如果我们引入 D Z轴 .

    id | a_id | b_id | c_id
    -----------------------
    1  | 1    | NULL | NULL
    2  | NULL | 1    | NULL
    3  | NULL | NULL | 1
    

    我们从两列开始构建对其他表的引用。但是,当我们介绍

    id | z_id | z_type
    ------------------
    1  | 1    | 'A'
    2  | 1    | 'B'
    3  | 1    | 'C'
    

    因此,我们可以通过使用复合外键实现某种程度的规范化。如果两列都被索引,查询应该非常快。虽然它必须比使用单个外键慢,但差别是微不足道的。

    通常情况下,每当您有看起来相同的数据(例如:Address)时,就很容易使用Rails的多态关联。在将多个模型耦合在一起时,应始终保持谨慎。一个很好的指标是,当你注意到自己在根据关联类型进行切换时,你已经走得太远了。一个潜在的解决方案是将公共代码重构成一个模块,并将其混合到您关心的模型中。

        2
  •  1
  •   HLGEM    14 年前