小编典典

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

all

在设计表格时,我养成了一个习惯,即拥有一个唯一的列并且我将其作为主键。这可以根据要求通过三种方式实现:

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

数字 3 将用于相当小的查找,主要是读取可能具有唯一静态长度字符串代码或数值(例如年份或其他数字)的表。

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

问题:-)

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

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

这有一个有效的案例吗?我总是会为这些情况定义一个身份或唯一标识符列。

此外,还有很多表根本没有主键。有什么正当理由(如果有的话)?

我试图理解为什么桌子被设计成原来的样子,这对我来说似乎是一团糟,但也许有很好的理由。

第三个问题可以帮助我破译答案:在使用多列组成复合主键的情况下,这种方法与代理/人工键相比是否有特定优势?我主要考虑性能、维护、管理等方面的问题?


阅读 104

收藏
2022-05-05

共1个答案

小编典典

我遵循一些规则:

  1. 主键应尽可能小。首选数字类型,因为数字类型以比字符格式更紧凑的格式存储。这是因为大多数主键将是另一个表中的外键以及用于多个索引。您的键越小,索引越小,您将使用的缓存中的页面就越少。
  2. 主键不应该改变。更新主键应该永远是不可能的。这是因为它最有可能在多个索引中使用并用作外键。更新单个主键可能会导致更改的连锁反应。
  3. 不要使用“你的问题主键”作为你的逻辑模型主键。例如护照号码、社会保险号码或员工合同号码,因为这些“自然密钥”在现实世界中可能会发生变化。确保在必要时为这些添加 UNIQUE 约束以强制保持一致性。

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

2022-05-05