Ruby on Rails ORM(对象关系映射)具有调用多态关联的东西,允许使用外键来引用2个或更多其他表。这是通过创建一个名为“type”的附加列来实现的,该列指定与外键关联的表。
从数据库的角度来看,此实现是否具有名称?这是好事/坏事吗?
感谢
答案 0 :(得分:1)
是的,使用多个键来引用唯一记录称为复合键。它的好坏取决于您的数据库架构。
让我们假设我们有4个表:A
,B
,C
和Z
。 Z
维护对A
,B
和C
的引用。每条记录都包含对单个表的引用。以下是Z
的两个潜在架构。
我们需要一个列来存储每个表的引用。这意味着我们将为未使用的列结束NULL值。将来,如果我们引入D
表,那么我们将需要向Z
添加新列。
id | a_id | b_id | c_id
-----------------------
1 | 1 | NULL | NULL
2 | NULL | 1 | NULL
3 | NULL | NULL | 1
我们从两列开始构建对其他表的引用。但是,当我们介绍D
时,我们不需要修改架构。此外,我们永远不会有具有NULL值的列。
id | z_id | z_type
------------------
1 | 1 | 'A'
2 | 1 | 'B'
3 | 1 | 'C'
因此,我们可以通过使用复合外键来实现某种程度的规范化。如果两列都已编制索引,则查询速度应该非常快。虽然它必须比使用单个外键慢,但差别是微不足道的。
每当看到相同的数据(例如:地址)时,通常很容易使用Rails的多态关联。将多个模型耦合在一起时应始终谨慎。你已经走得太远的一个好指标就是当你注意到自己根据关联类型进行切换时。一个潜在的解决方案是将公共代码重构为一个模块,并将其混合到您关心的模型中。
答案 1 :(得分:1)
并非所有数据库都允许使用复合外键,而且我个人会尝试将任何尝试这样做的人发送到我的数据库。外键必须由数据库维护,而不是像Rails那样。还有其他进程通常会访问数据库,必须检查这个关键关系,这可能不使用ORM(我当然不会使用这样的东西来导入10,000,000记录文件或更新一百万个价格记录或修复数据诚信问题。