使用现有候选键或新的复合键作为主键

时间:2017-09-15 17:53:36

标签: sql sql-server primary-key composite-primary-key candidate-key

我从不同的数据源收到一些唯一的案例编号,这些数据源可以作为我数据库的候选键。在创建全新的桌子时,最佳做法是什么?创建一个复合键(我的候选键和PK的自动生成的ID)或者只是为这个新表定义一个PK并在我的候选键上定义一个CHECK CONSTRAINT?

2 个答案:

答案 0 :(得分:2)

这是一个棘手的问题。一般来说,我习惯于推荐代理主键 - 但不是复合键,只是自动递增键。以下是一些原因:

  • 整数主键较小,因此占用空间较小。
  • 整数外键大小一致,因此效率更高(次要考虑)。
  • 源系统可能会更改密钥的定义。

也就是说,在某些情况下,您可能希望使用源系统密钥而不是人工密钥。假设代码确实由源系统拥有并且它没有改变(源系统定义了什么"它"是)。然后,您可能希望将其作为主键 - 如果您可能需要重新加载数据。

为什么呢?重新加载数据可能会重新排序密钥。然后外键引用将失效。通常,数据重新加载将使用更新来处理,但可能存在可能需要批发替换的情况。

你可以想象我最近遇到过这种情况。

答案 1 :(得分:-1)

最佳做法是您的数据库拥有PK。考虑一下情况,您的来源是Sales Force上的产品表,产品代码是' 1234'无论出于何种原因,一段时间后,您的公司更改了SAP,同一产品将代码更改为“KA2541'”。如果您使用销售代码作为PK对数据库建模,则有两个选项:

  1. 创建一个新列以保存新代码并更改所有程序以显示新代码
  2. 更改列的数据类型并进行更新。
  3. 这两个场景有很多风险关联,另一方面,如果你开始建模,考虑外部键的列与源关系无关紧要,你关心的是在源更改时更新外部代码。