Sql表设计 - 从唯一键和业务键中选择主键

时间:2014-06-05 18:24:06

标签: sql sql-server database-design

我需要设计一个表格,并且对选择主键字段感到困惑。对于例如,使用以下列创建表格学生

  • ID - 唯一键和自动增量为1。
  • RegistrationNumber - 表格中的数字是唯一的
  • 命名
  • RegistrationDate

现在我的问题是:从上表中我们可以看到 ID和RegistrationNumber 都是唯一的,而RegistrationNumber服务器是业务目的,但ID用于将此表与其他人一起引用。所以我可以将这两列作为主键。

从业务上下文注册号应该是表的主键,但由于我在其他表事件中引用Id,我可以选择ID作为PK ..

请告诉我哪一个应该合适。

提前致谢。

4 个答案:

答案 0 :(得分:1)

你应该为你的PK使用代理键。我建议您使用ID列作为PK。

如果RegistrationNumber列必须是唯一的,您可以随时在其上添加unique constraint

在此处阅读代理键:Surrogate vs. natural/business keys

此处:https://en.wikipedia.org/wiki/Surrogate_key

答案 1 :(得分:1)

如果RegistrationNumber在逻辑级别是唯一的,那么在数据库级别对其进行适当的约束,无论是什么ID

您需要做出以下设计决定:

  • 你需要ID吗?从逻辑角度来看,您也可以从其他表中引用RegistrationNumber,尽管从物理角度来看它可能不一定是个好主意。有关您可以选择其他方式的原因的更多信息,请参阅here
  • 如果您确定需要ID,请确定它是PRIMARY KEY还是UNIQUE(与RegistrationNumber相反)。从逻辑上讲,它不会产生difference,但请注意,除了物理级别MS SQL Server自动clusters PRIMARY KEY上的表,除非使用NONCLUSTERED关键字。 1

1 MS SQL Server允许您使用特殊语法在任何列上聚类,而不仅仅是PRIMARY KEY。我上面描述的只是一个默认值。

答案 2 :(得分:0)

该问题被标记为SQL Server。就SQL Server而言,哪一个被指定为PRIMARY KEY和哪个UNIQUE没有区别。 SQL Server对它们的处理方式相同。重要的是你如何利用它们。

制作一把钥匙" primary"本质上是一个传统和美学的问题,而不是任何具有根本或实际意义的问题。有些人选择指定"首选"或者最重要的业务密钥作为主键,其他的总是将其作为其他表引用的密钥(如果有的话)。

答案 3 :(得分:0)

请勿将重新启动号码用作主键。

为什么?

因为在某些年份,有人可能决定改变它 - 添加一些数字等等 - 然后你就处于痛苦的世界。

出于这个原因,注册码是标准的varchar列 - 因此不适合主键。它并非绝对独特且不变,因为人们会在业务中做出各种改变事情的决定。