小编典典

表中主键的最佳做法是什么?

sql

在设计表时,我养成了一种习惯,即有一列是唯一的,并且我将其作为主键。这可以通过三种方式来实现,具体取决于需求:

  1. 自动递增的标识整数列。
  2. 唯一标识符(GUID)
  3. 可以用作行标识符列的短字符(x)或整数(或其他相对较小的数字类型)列

数字3将用于较小的查找,大多数是读取的表,这些表可能具有唯一的静态长度字符串代码或数字值,例如年份或其他数字。

在大多数情况下,所有其他表将具有自动递增的整数或唯一标识符主键。

问题:-)

我最近开始使用没有一致的行标识符的数据库,并且主键当前聚集在各个列中。一些例子:

  • 日期时间/字符
  • 日期时间/整数
  • 日期时间/ varchar
  • 字符/ nvarchar / nvarchar

有没有有效的理由呢?对于这些情况,我将始终定义一个标识或唯一标识符列。

此外,还有许多根本没有主键的表。这样做的有效原因是什么(如果有)?

我试图理解为什么表是按原样设计的,这对我来说似乎是一个大麻烦,但是也许有充分的理由。

第三个问题可以帮助我解释答案:如果使用多列组成复合主键,与代理/人工键相比,此方法是否具有特定优势?我主要是在性能,维护,管理等方面进行思考?


阅读 197

收藏
2021-05-05

共1个答案

小编典典

我遵循一些规则:

  1. 主键应尽可能小。首选数字类型,因为数字类型以比字符格式更紧凑的格式存储。这是因为大多数主键都将是另一个表中的外键以及在多个索引中使用。键越小,索引越小,将使用的缓存中的页面越少。
  2. 主键永远不应该改变。更新主键始终是不可能的。这是因为它最有可能在多个索引中使用并用作外键。更新单个主键可能会引起更改的连锁反应。
  3. 不要将“您的问题主键”用作逻辑模型主键。例如,护照号,社会保险号或雇员合同号,因为这些“主键”在实际情况下可能会发生变化。

关于代理键与自然键,我参考上面的规则。如果自然键很小并且永远不会更改,则可以将其用作主键。如果自然键很大或可能会更改,则使用代理键。如果没有主键,我仍然会使用代理键,因为经验表明您将始终向表中添加表,并希望您将主键放在适当的位置。

2021-05-05