【发布时间】:2011-02-09 17:05:47
【问题描述】:
为什么拒绝复合键而支持使用名为 id 的单个主键的所有表?因为通常所有的 ORM 都遵循这个。
编辑
我刚开始在 Rails 上学习 ruby,在 pragmatic 的敏捷开发书中有一句话:--- Rails 真的不能很好地工作,除非每个表都有一个数字主键。对列的名称不那么挑剔。 我在学习 Doctrine 时读到的同一种台词。
EDIT2 请也检查此链接。我越来越对这件事感到困惑:--- Composite primary keys versus unique object ID field
从上面的链接:--
*主键应该是常量且无意义的;非代理键通常最终无法满足一项或两项要求
如果密钥不是恒定的,那么您未来的更新问题可能会变得非常复杂 如果密钥不是无意义的,那么它更有可能改变,即不是恒定的;见上文
举一个简单的常见示例:库存物品表。将商品编号(SKU 编号、条形码、零件代码或其他任何内容)作为主键可能很诱人,但一年后所有的商品编号都发生了变化,您将面临一个非常混乱的更新——整个——数据库问题...
编辑:还有一个比哲学更实际的问题。在许多情况下,您会以某种方式找到特定的行,然后更新它或再次找到它(或两者兼而有之)。使用复合键,在 WHERE 子句中有更多的数据需要跟踪,更多的约束用于重新查找或更新(或删除)。与此同时,关键部分之一也可能发生了变化!使用代理键,始终只保留一个值(代理 ID),根据定义,它不能更改,这大大简化了情况。*
【问题讨论】:
-
你能引用你的来源吗?我同时使用:复合键和基于序列的 ID 主键。有时一个比另一个更合适。
-
你在使用什么 ORM,它提倡总是使用简单键而不是复合键?我从来没有遇到过不能很好地使用复合键的 ORM。据我所知,没有充分的理由给予例如联结表自己的代理键。
-
@FrustratedWithFormsDesigner @Iain Galloway 我在学习 Doctrine 时读到了这篇文章,现在我在学习 Ruby on rails 时遇到了同样的事情。如果你想要写这行的书的确切页码,请告诉我。我是初学者,所以我要的是真实的东西。不要对此进行交叉提问或辩论。表示他们使用此 ID 字段的原因。 ??
-
在这种情况下,我认为“主键优于复合键”的说法可能在 Ruby-on-Rails 和 Doctrine 的上下文中是正确的。这可能是因为底层架构(但我不是 Rails 或 Doctrine 方面的专家,所以我不能安全地进一步评论;)),但该声明应该 not 被假定为自动适用于其他环境/ORMS。
-
@FrustratedWithFormsDesigner 看看编辑部分。检查链接。
标签: database-design orm primary-key