SQL主键决策

时间:2014-05-28 15:53:33

标签: sql-server sql-server-2005 database-design primary-key

在我的情景中,我正在跟踪一群成员和他们的医生变化

相关栏目是

MemberID | Prov_Nbr | Prov_Start_Date | Prov_End_Date | Prov_Update_Date

我的问题是关于主键

在这种情况下,在自动增量字段上使用主键会更好,并将列添加到前面,如下所示:

IDENTITY |MemberID | Prov_Nbr | Prov_Start_Date | Prov_End_Date | Prov_Update_Date

或者根据业务规则/数据的唯一性创建主键?

MemberID - PK1 | Prov_Nbr - PK2 | Prov_Start_Date - PK3 | Prov_End_Date | Prov_Update_Date

这是每周处理后数据在表格中的显示方式:

MemberID | Prov_Nbr | Prov_Start_Date | Prov_End_Date | Prov_Update_Date
------------------------------------------------------------------------
ABC123| IR456|2014-01-01|null|null - original record
ABC123| IR102|2014-04-01|null|null - new record turns original record `Prov_End_Date` to New `Prov_Start_Date - 1 day`

所以表格如下:

ABC123 | IR456 | 2014-01-01 | 2014-03-31 | null
ABC123 | IR102 | 2014-04-01 | null       | 2014-04-30

还在我身边吗?

在某些情况下,根据业务性质,会员可以拥有"复古"这基本上意味着:

ABC123 | IR456 | 2014-01-01| 2014-03-31 | null
ABC123 | IR102 | 2014-04-01| null       | 2014-04-30

获得新记录

ABC123 | IR402 | 2014-01-01 | null | null

基本上将原始记录改装为新的提供者。

这种情况会破坏数据的唯一性吗?或者SQL是否知道如何将其作为主键更新处理?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

我实际上会将两个解决方案放到位,就像创建一个标识字段作为主键(可能是clustered添加一个唯一的关键MemberID, Prov_Nbr, Prov_Start_Date

顶尖的SQL Server博客作者几乎总是颂扬作为PK的身份的优点,包括与代理人类似的情况,然后您可以另外强制执行与英国的业务规则。当然,我希望我正确地阅读你的要求,特别是“复古”部分。