5

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

编辑:
有人向我指出这与这个问题非常相似。

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

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

4

6 回答 6

8

一个主键

  1. 必须唯一标识一行。
  2. 不能包含数据,否则当你的数据改变时它会改变(这是不好的)
  3. 比较操作应该很快(WHERE 子句/连接)

理想情况下,您对行使用人工(代理)键,数字整数数据类型 (INT) 是最好的,因为空间效率高且速度快。

主键应由仍然满足条件 1.-3 的最少字段数组成。对于绝大多数表格,此最小值为:1 个字段。

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

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

如果您绝对确定它是唯一的并且永远不会改变,您可以从数据中创建主键。由于这很难保证,我建议不要这样做。

于 2009-02-10T13:48:57.693 回答
2

总是整数。

当需要交叉引用其他表中的这些元素(使用外键)时,您会很感激您这样做

于 2009-02-10T13:50:08.597 回答
1

不管它是什么,让它没有意义(代理键)。有意义的主键是致命的。

于 2009-02-10T13:42:37.133 回答
1

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

于 2009-02-10T13:44:36.487 回答
0

我会说自动生成,我没有真正的理由不这样做。除非您开发某种哈希表,但即便如此,我仍会坚持使用由数据库自动创建的唯一主键。它快速、简单、可靠。如果它已经存在,请不要重新发明轮子。

于 2009-02-10T13:42:47.087 回答