我需要设计一个表格,并且对选择主键字段感到困惑。对于例如,使用以下列创建表格学生
现在我的问题是:从上表中我们可以看到 ID和RegistrationNumber 都是唯一的,而RegistrationNumber服务器是业务目的,但ID用于将此表与其他人一起引用。所以我可以将这两列作为主键。
从业务上下文注册号应该是表的主键,但由于我在其他表事件中引用Id,我可以选择ID作为PK ..
请告诉我哪一个应该合适。
提前致谢。
答案 0 :(得分:1)
你应该为你的PK使用代理键。我建议您使用ID
列作为PK。
如果RegistrationNumber
列必须是唯一的,您可以随时在其上添加unique constraint
。
在此处阅读代理键:Surrogate vs. natural/business keys
答案 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列 - 因此不适合主键。它并非绝对独特且不变,因为人们会在业务中做出各种改变事情的决定。