本机主键还是自动生成的?

时间:2009-02-10 13:40:36

标签: database database-design primary-key

通常最好使用本机主键(即现有列或列组合)或将主键设置为自动生成的整数行?

修改
有人向我指出,这与this question非常相似。

这里的共识是使用代理键,这是我的天生倾向,但我的老板告诉我,我应该尽可能使用自然键。他的建议对于这个特定的应用程序可能是最好的,因为行中的Name唯一标识它,我们需要保持查看旧数据的能力,因此对名称/规则的任何更改都将意味着新的唯一行。

虽然这里的答案都很有帮助,但大多数都是基于主观的“这就是你应该做的”,而不是引用支持来源。我是否缺少一些必要的阅读材料,或者数据库设计是否具有高度主观性和/或依赖于应用程序的最佳实践?

6 个答案:

答案 0 :(得分:8)

主键

  1. 必须唯一标识一行。
  2. 不得包含数据,否则会在数据发生变化时发生变化(这很糟糕)
  3. 应该快速比较操作(WHERE子句/连接)
  4. 理想情况下,您为行使用人工(代理)键,数字整数数据类型(INT)最好,因为节省空间且速度快。

    主键应该由最小数量的字段组成,以满足条件1.-3。对于绝大多数表,最小值为:1字段。

    对于关系表(或非常特殊边缘情况),它可能更高。引用具有复合主键的表很麻烦,因此不建议对必须自己引用的表使用复合键。

    在关系表(m:n关系)中,您可以从相关表的主键中创建一个复合键,因此您的复合键会自动满足上述所有三个条件。

    如果完全确定可以从数据中生成主键,它将是唯一的并且将永远不会更改。由于这很难保证,我建议不要这样做。

答案 1 :(得分:4)

答案 2 :(得分:2)

总是整理。

当您需要在其他表格中交叉引用这些元素时(使用外键),您会感谢您这样做了

答案 3 :(得分:1)

无论是什么,使其无意义(代理键)。有意义的主键是致命的。

答案 4 :(得分:1)

这是纯粹主义者和实用主义者之间的旧战争。 纯粹主义者不接受代理主键,并坚持只使用自然主键。 如果你问我,我会在大多数情况下投票支持增量(代理键)。

答案 5 :(得分:0)

我想说自动生成,没有真正的理由不在我脑海里。除非你开发某种哈希表,否则我会坚持使用由数据库自动创建的唯一主键。它快速,简单,可靠。如果它已经存在,请不要重新发明轮子。