Sql server SQL主键决策
在我的场景中,我正在跟踪一组成员及其医生的变化 有关栏目包括Sql server SQL主键决策,sql-server,sql-server-2005,database-design,primary-key,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 | 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知道如何将其作为主键更新来处理吗
非常感谢您提供的任何帮助。我会将您的两种解决方案都放在适当的位置,比如创建一个身份字段作为您的主键(可能),并在MemberID、Prov\u Nbr、Prov\u Start\u Date上添加一个唯一的键
顶级SQL Server博客作者几乎总是赞美PK身份的优点,包括类似于此的情况,即它是一个代理,然后您可以在英国另外执行您的业务规则。当然,我希望我正确地阅读了您的要求,尤其是“复古”部分。是的,毫无疑问,您的阅读是正确的。我与一些数据架构师交谈时说,使用数据中的唯一ID胜过身份或AI,但AI仍然是一种有效的选择。好答案+1让我们看看别人怎么说@希厄普顿,这是一个普遍的问题。有些人相信自然键,有些人相信代理键。我属于后一种信仰,这通常是两全其美的。您可以在自然键上获得所需的唯一索引,但不必将数据复制到任何相关表中,并且可以使用代理键进行连接,这样,较小的较轻的suggogate键将提供更快的性能,并且您永远不必更新一百万个子记录,因为自然键已更改。在本例中,我不确定您是否需要任何子表,因此可以使用自然键。但我仍然非常喜欢这种解决方案。主要是因为当我认为我将永远不需要一个子表时…感谢podiluska和HLGEM为我的简短回答添加了一些真正的内容。太棒了,我会让我的DBA为这些字段分配主键,当时它被设置为IDENTITY,但我无法接受。谢谢你们的回复,伙计们。