具有复合主键的优点和缺点

时间:2012-07-20 21:11:23

标签: tsql

不是使用复合主键(此表维护表示两个实体[两个表]的两个表之间的关系),而是建议将identity列作为主键和唯一数据约束强制执行两列,代表实体主键的数据。

对于我来说,每个关系表的标识列都违反了规范化规则。

  • 什么是行业标准?
  • 在做出设计决定之前需要考虑哪些因素?
  • 哪种方法是对的?

3 个答案:

答案 0 :(得分:6)

有许多表可能需要将标识列作为主键。但是,对于您描述的M:M关系表,最佳做法是不要为主键使用新的标识列。

RThomas在评论中的链接提供了最佳做法是不添加标识列的绝佳理由。这是that link

几乎在每种情况下,利弊都会超过职业选手,但是既然你要求利弊我也会把几个不太可能的职业选手放进去。

<强>缺点

  • 添加复杂性

  • 除非您对关系强制执行唯一性(默认情况下主键会执行此操作),否则会导致重复关系。

  • 可能更慢:db必须维护两个索引而不是一个。

<强>赞成

所有职业选手都非常粗略

  • 如果您需要使用关系表的主键作为单独表(例如审计表?)的连接,则连接可能会更快。 (如上所述 - 添加和删除记录可能会更慢。此外,如果您的关系表是自己使用唯一ID的表之间的关系,则使用连接中的一个标识列与两个标识列的速度增加将是最小的。)

  • 为简单起见,应用程序可能会假设它使用的每个表都有一个唯一的ID作为其主键。 (这在应用程序中的设计很糟糕,但你可能无法控制它。)你可以想象一个场景,在数据库中引入一些额外的复杂性比在这样的应用程序中增加额外的复杂性更好。

答案 1 :(得分:2)

<强>缺点:

  • 必须在所有引用表中导入复合主键。 这意味着更大的索引和更多的代码(例如连接, 更新)。如果你系统地使用复合初级 钥匙,它可以变得非常麻烦。
  • 您无法更新主键的一部分。例如。如果你使用 university_id,student_id作为大学表格中的主键 学生和一名学生改变大学,你必须删除 并重新创建记录。

优点:

  • 复合主键允许强制执行常见的约束 以强大而无缝的方式。假设你有一个表大学, 学生表,课程表和表STUDENT_COURSE(表 学生遵循哪个课程)。如果它总是你的约束 必须是大学A的学生才能学习 大学A,那么该约束将自动验证,如果 university_id是学生和学生的复合键的一部分 课程。

答案 2 :(得分:2)

您必须在每个表中创建所有列,无论它们用作外键。这是最大的劣势。