sql - 联结表的主键/聚集键

标签 sql clustered-index junction-table

假设我们有一个 Product 表、Order 表和一个(连接表)ProductOrder。

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

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

  • 我是否应该保留 ID 字段的主键并为外键对(ProductID 和 OrderID)创建一个非聚集索引
  • 或者我应该放置外键对的主键(ProductID 和 OrderID)并在 ID 列上放置一个非聚集索引(如果有必要)
  • 或者...(你们中的一个聪明的评论:))
  • 最佳答案

    我知道这些话可能会让你畏缩,但“这要看情况”。

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

  • 首先了解您为什么以及如何使用代理键 ID
    首先;这通常会决定你如何索引它。一世
    假设您正在使用代理键,因为您正在使用一些
    适用于单列键的框架。如果没有
    特定的设计原因,然后对于连接表,我会简化
    问题,只需删除自动编号 ID,如果它没有带来其他
    益处。主键变为 (ProductID, OrderID)。如果不,
    您至少需要确保 (ProductID,
    OrderID) 元组是唯一的以保持数据完整性。
  • 聚簇索引适用于顺序扫描/连接,当
    查询需要与索引排序相同的结果。
    因此,请查看您的访问模式,找出您使用的键
    将进行顺序的、多行的选择/扫描,以及
    键,您将进行随机的、单独的行访问,并创建
    您最常扫描的键上的聚集索引,以及非聚集索引
    您将用于随机访问的 key 上的 key 索引。你必须
    选择其中之一,因为您不能将两者都聚集在一起。

  • 注意:如果您有相互冲突的要求,有一种技术(“技巧”)可能会有所帮助。如果查询中的所有列都在索引中找到,则该索引是数据库引擎用来满足查询要求的候选表。您可以使用这一事实以多个顺序存储数据,即使它们彼此冲突。请注意向索引添加更多字段的利弊,并在了解将处理的查询的性质和频率后做出有意识的决定。

    关于sql - 联结表的主键/聚集键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2410654/

    相关文章:

    phpbb3 数据库索引太长

    mysql - SQL - 通过检查两列来更新或插入

    sql - SQL Server 中的作业历史记录

    sql-server - 拥有包含聚集索引中的主键的非聚集索引是否不好?

    mysql - SQL连接具有多对多关系的联结表

    php - 在联结表中插入值

    sql - 如何提示从SSIS包中输入?

    mysql - 我可以创建一个没有 PK 的 InnoDB 表吗?如果是的话,是否会使用二级索引作为聚集索引?

    database - 在 sql server 2008 中更新聚集列的成本是多少

    MySQL SELECT 查询具有多个表的联结表