Sql server 主键是否通过é;?

Sql server 主键是否通过é;?,sql-server,database-design,primary-key,Sql Server,Database Design,Primary Key,主键提供什么独特的功能 虽然我在标题中直言不讳地提到了这个问题,但我的问题是严肃的。在任何火焰开始之前,我并不是说构建一个没有约束或引用完整性的数据库。然而,据我所知,SQL Server可以去掉主键关键字 唯一索引包括唯一性 基于列的非空性包括PKs的非空性要求 PK不必聚集在一起,所以不是这样 外键可以而且通常是通过唯一索引而不是PK实现的 甚至MSDN也声明创建一个唯一索引来强制PK的唯一性 我确实同意,从逻辑上讲,主键对数据模型有一点意图,但这是真的吗?[讽刺]哦,我们的确在设计桌子

主键提供什么独特的功能

虽然我在标题中直言不讳地提到了这个问题,但我的问题是严肃的。在任何火焰开始之前,我并不是说构建一个没有约束或引用完整性的数据库。然而,据我所知,SQL Server可以去掉
主键
关键字

  • 唯一索引包括唯一性
  • 基于列的非空性包括PKs的非空性要求
  • PK不必聚集在一起,所以不是这样
  • 外键可以而且通常是通过唯一索引而不是PK实现的
  • 甚至MSDN也声明创建一个唯一索引来强制PK的唯一性
我确实同意,从逻辑上讲,主键对数据模型有一点意图,但这是真的吗?[讽刺]哦,我们的确在设计桌子时看到了SSMS显示的小按键图标![/讽刺]


编辑

从评论来看,很明显我问这个问题没有我想的那么清楚。我同意主键从逻辑角度来看很重要

我不是问:

  • 我应该为我的PK选择int还是varchar
  • PK是否必须群集,或者我如何确定应该群集的内容
  • 如何唯一标识行

我的意图是问“PK提供了哪些不能合理地使用其他功能实现的功能?”我不是建议在这里发疯——比如使用触发器强制唯一性而不是唯一约束/索引。合理在这里是一个关键词——使用唯一的索引/约束似乎与定义PK非常相似。

主键是一个逻辑概念。它是定义实体标识的键:在小部件表中,每个小部件通过其主键值进行区分。PK不是聚集索引(即物理存储属性),也不是唯一约束(即不同的逻辑属性)。虽然主键和聚集键经常重叠,但这只是巧合(PK是一个方便的聚集键),甚至只是疏忽(PK被用作聚集键,即使给定工作负载存在更好的候选者)

更改群集密钥是一种可以随时在现场由ops进行的更改,以更好地满足此存储需求或性能工作负载需求。应用程序不应该注意到变化(在理想世界中…)。更改PK是一种设计更改,需要在对象标识符更改时修改应用程序的数据模型,并且通常会通过数据模式/应用程序代码进行渗透

顺便说一句,这个话题已经在这里被问到并回答得很恶心了:

详细说明PK和唯一约束之间的区别:即使有几个属性具有唯一约束,因此可以用作PK,但只有一个属性是正确的选择,它们并不相等。哪一个完全取决于数据模型、业务含义、实体以及每个属性所代表的内容。PK对于DBMS并不重要,DBMS真正关心的是集群密钥和唯一性,而不是PK。PK是为您、开发人员和您的工具集准备的。您不希望每个使用ORM工具指向数据库的开发人员都选择一个不同的唯一键作为实体标识,然后每个开发人员都编写代码来存储不同的属性作为标识。您希望所有人都选择同一个主键,因为主键除了唯一之外还有其他属性。一个主要的例子是稳定性,PK值在实体的整个生命周期内都是稳定的(如果不是,则PK选择不正确)

PK提供了哪些无法合理实现的功能 使用其他功能

小SSMS图标。说真的,归根结底,这就是问题的症结所在:PK传递了额外的信息,哪些可能的键实际上是标识表中实体的键。确实在今天的PK位置上发挥了重要作用,同意,但如果不是因为这个原因,其他一些结构将出现,以实现这一传递逻辑模型意图的角色。

您指出

从逻辑上讲,主键包含一点意图

Aaron Betrand在评论中指出

您可以有多个唯一约束或唯一索引,但只有一个约束或索引应该是您通常希望标识行的方式

我猜Aaron使用了像“应该”和“典型”这样的词,因为他知道即使是外键约束也只需要一个唯一的约束

外键约束不必仅链接到另一个表中的主键约束;还可以将其定义为引用另一个表中唯一约束的列

此外,C.J.日期

如果候选密钥集实际上包含多个 成员,则选择哪一个是主要的 武断的*

这使我得出结论,主键除了约定之外,实际上并没有提供太多。但它与我们使用的工具和大多数人的心理模型紧密结合在一起,不容忽视


*C.J.日期:选择主键并非完全任意。例如,易变主键是个坏主意。

完全不同的观点:

SQL是一种由ISO标准定义的语言。该标准具有“强制性”特征和“可选一致性”特征

如果您使用某种数据操作语言构建DBMS,则只有在以下情况下,您才有权调用您的语言“SQL”:

(a) 您已经实现了标准规定的所有语法(“强制”功能),并且 (b) 所有的语言特性