Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL主键决策_Sql Server_Sql Server 2005_Database Design_Primary Key - Fatal编程技术网

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,但我无法接受。谢谢你们的回复,伙计们。