【发布时间】:2010-08-20 21:46:33
【问题描述】:
我已经浏览了链接:
Database Design: Composite key vs one column primary key
我的问题:
对于一个永远不能作为外键引用到任何其他表的表,在插入/更新基于单列的主键与多列/复合列主键方面,+ve / -ve 方面是什么?
谢谢
【问题讨论】:
标签: database-design
我已经浏览了链接:
Database Design: Composite key vs one column primary key
我的问题:
对于一个永远不能作为外键引用到任何其他表的表,在插入/更新基于单列的主键与多列/复合列主键方面,+ve / -ve 方面是什么?
谢谢
【问题讨论】:
标签: database-design
是的,多列主键仍然是一个不好的选择,如果:
因为:
因此:如果您有一个 200 字节大小的复合主键,并且您的表上有一些非聚集索引,那么您将在 SQL 上浪费 大量 内存服务器 - 不仅在(相对便宜的)磁盘上,而且在 SQL Server 主内存中(通常不那么便宜)。
除了浪费空间之外,您的性能也会滞后,因为更大的索引意味着相同操作的磁盘 I/O 更多。
一般情况下:仅在您从不需要引用该表(实际上永远不会,甚至将来也不会)并且没有其他表的情况下才在表上使用复合主键 该表上的非聚集索引。
【讨论】:
您怎么可能绝对确定您的密钥“永远不会被 FK 引用”?
您的属性组合确实是独一无二的(否则您不会考虑将其设为“主键”)。
因此,您的属性组合是识别表中描述的真实事物的有效方法。
说这永远不会被 FK 引用就等于说“没有关于此类事物的额外信息将永远与业务相关”。你怎么可能知道?
【讨论】:
业务要求(数据完整性要求)应该是决定要实施哪些密钥的因素。对一个属性强制唯一性显然与对多个属性强制不同,因为在一种情况下允许的重复项在另一种情况下不允许(当然,除非您实现 both 键)。
请注意,marc 的回答仅适用于聚集索引,不适用于主键。它们不是同一件事。他的回答也是针对 SQL Server 的。
【讨论】:
在这个问题上有两种相互竞争的哲学。
我本人坚定地支持对某些表使用复合主键。
当我设计一个数据库时,我使用 ER 建模在一个地方收集信息需求。数据库提供的每个值都是属性的一个实例,每个属性描述一个主题实体或两个或多个主题实体之间的关系。外键不进入分析阶段。
在开始数据库设计之前,我从应用程序的角度决定如何识别每个实体。这些将给我我的主键。每个描述实体的表都有一个简单的主键,即实体的标识符。简单的关系(二进制、多对一)不需要自己的表。每个描述复杂关系的表都有一个由参与实体的主键组成的复合主键。
外键以显而易见的方式插入。好吧,至少对我来说很明显。这提供了 3NF 中的初始表设计,并且可能更高。表设计可能会通过进一步的规范化或其他与规范化不兼容的设计模式(所谓的非规范化)而改变。但这是餐桌设计的第一次削减。
就性能和数据完整性而言,这种设计实践与主流实践产生了不同的结果。普遍的做法是在每个表的第一列中放置一个名为“id”的自动编号列。此列成为主键。
本质上,这种做法使用 SQL 表结构来模仿数据的图形模型,即使它看起来像一个关系模型。 id 列本质上是行地址的代理。数据的图形模型有一个优点和一个缺点。如果需要,请提供更多信息。
【讨论】: