假设我们有一个 Product 表、Order 表和一个(连接表)ProductOrder。
ProductOrder 将有一个 ProductID 和一个 OrderID。
在我们的大多数系统中,这些表还有一个称为 ID 的自动编号列。
放置主键(以及集群键)的最佳做法是什么?
最佳答案
我知道这些话可能会让你畏缩,但“这要看情况”。
您很可能希望订单基于 ProductID 和/或 OrderId 而不是自动编号(代理)列,因为自动编号在您的数据库中没有自然意义。您可能希望按与父表相同的字段对连接表进行排序。
首先;这通常会决定你如何索引它。一世
假设您正在使用代理键,因为您正在使用一些
适用于单列键的框架。如果没有
特定的设计原因,然后对于连接表,我会简化
问题,只需删除自动编号 ID,如果它没有带来其他
益处。主键变为 (ProductID, OrderID)。如果不,
您至少需要确保 (ProductID,
OrderID) 元组是唯一的以保持数据完整性。
查询需要与索引排序相同的结果。
因此,请查看您的访问模式,找出您使用的键
将进行顺序的、多行的选择/扫描,以及
键,您将进行随机的、单独的行访问,并创建
您最常扫描的键上的聚集索引,以及非聚集索引
您将用于随机访问的 key 上的 key 索引。你必须
选择其中之一,因为您不能将两者都聚集在一起。
注意:如果您有相互冲突的要求,有一种技术(“技巧”)可能会有所帮助。如果查询中的所有列都在索引中找到,则该索引是数据库引擎用来满足查询要求的候选表。您可以使用这一事实以多个顺序存储数据,即使它们彼此冲突。请注意向索引添加更多字段的利弊,并在了解将处理的查询的性质和频率后做出有意识的决定。
关于sql - 联结表的主键/聚集键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2410654/