首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复合主键与基于单列的主键

复合主键与基于单列的主键
EN

Stack Overflow用户
提问于 2010-08-19 15:41:29
回答 4查看 2.7K关注 0票数 1

我已经通过link:

Database Design: Composite key vs one column primary key

我的问题是:

对于一个永远不能作为外键引用到任何其他表的表,在基于单列的主键与多列/复合列主键的插入/更新方面,+ve / -ve方面是什么?

谢谢

EN

回答 4

Stack Overflow用户

发布于 2010-08-19 15:57:17

是的,在以下情况下,多列主键仍然是一个不好的选择:

  • 您的主键也是聚类键
  • 您的表还包含其他非聚集索引

因为:

  • 聚集键(例如,单个INT列或组合键)中的值将被添加到每个非聚集索引

中的每个条目中

因此:如果您有一个200字节大小的复合主键,并且您的表上有一些非聚集索引,那么您将在SQL Server上浪费大量的内存-不仅是在(相对便宜的)磁盘上,而且在SQL Server主内存(通常不是很便宜)中也是如此。

除了浪费空间,您的性能也会滞后,因为更大的索引意味着更多的磁盘I/O用于相同的操作。

一般而言:如果您永远不需要引用该表(实际上永远不需要,甚至将来也不需要),并且如果您在该表上没有其他非聚集索引,则只在表上使用复合主键。

票数 4
EN

Stack Overflow用户

发布于 2010-08-19 17:48:53

你怎么可能绝对确定你的密钥“永远不会被FK引用”呢?

您的属性组合确实是唯一的(否则您不会考虑将其设置为“主键”)。

因此,您的属性组合是识别您的表中描述的真实事物的有效方法。

说这永远不能被FK引用等于说“关于这类东西的任何额外信息都不会变得与业务相关”。你怎么可能知道呢?

票数 2
EN

Stack Overflow用户

发布于 2010-08-19 16:22:37

业务需求(数据完整性需求)应该是决定实现哪些键的因素。在一个属性上强制唯一性显然与在多个属性上强制不同,因为在一种情况下允许的重复项在另一种情况下是不允许的(当然,除非同时实现两个键)。

请注意,marc的答案仅适用于聚集索引,而不适用于主键。它们不是一回事。他的回答也针对SQL Server。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3519690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档