连接表的主键/聚簇键

Zyp*_*rax 7 sql clustered-index junction-table

假设我们有一个Product表,Order表和一个(联结表)ProductOrder.

ProductOrder将具有ProductID和OrderID.
在我们的大多数系统中,这些表还有一个名为ID的自动编号列.

放置主键(以及群集密钥)的最佳做法是什么?

  • 我应该保留ID字段的主键并为外键对(ProductID和OrderID)创建非聚集索引

  • 或者我应该放置外键对的主键(ProductID和OrderID)并在ID列上放置非聚集索引(如果需要的话)

  • 或者......(你们其中一个人的聪明话:))

cod*_*eim 5

我知道这些话可能会让你感到畏缩,但"这取决于它".

您很可能希望订单基于ProductID和/或OrderId而不是autonumber(代理)列,因为自动编号在数据库中没有自然含义.您可能希望通过与父表相同的字段来对连接表进行排序.

  1. 首先要了解为什么以及如何使用代理键ID; 这往往会决定你如何索引它.我假设您正在使用代理键,因为您正在使用一些适用于单列键的框架.如果没有特定的设计原因,那么对于连接表,我会简化问题,只是删除自动编号ID,如果它没有带来其他好处.主键变为(ProductID,OrderID).如果没有,您至少需要确保(ProductID,OrderID)元组上的索引是唯一的,以保持数据完整性.

  2. 聚簇索引是良好的顺序扫描/连接时,查询需要以相同的顺序,该指标进行排序的结果.因此,查看您的访问模式,找出您将按顺序执行哪些键,多行选择/扫描,以及您将随机执行哪些键,单独行访问以及创建聚簇索引您将扫描最多的密钥,以及您将用于随机访问的密钥上的非群集密钥索引.您必须选择其中一个,因为您无法对两者进行聚类.

注意:如果您的要求存在冲突,则可以采用一种技巧("技巧").如果在索引中找到查询中的所有列,则该索引是数据库引擎用于满足查询要求的候选表.您可以使用此事实以多个订单存储数据,即使它们彼此冲突也是如此.只需要了解为索引添加更多字段的优缺点,并在了解将要处理的查询的性质和频率后做出有意识的决定.