13

代替具有复合主键(此表维护代表两个实体 [两个表] 的两个表之间的关系),该设计建议将identity列作为主键,并且在代表两个列的两个列上强制执行唯一数据约束来自实体主键的数据。

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

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

3 回答 3

10

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

RTomas 在他的评论中的链接提供了最佳实践是不添加标识列的绝佳理由。这是那个链接

在几乎所有情况下,缺点都会超过优点,但既然你问了优点和缺点,我也放了几个不太可能的优点。

缺点

  • 增加复杂性

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

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

优点

所有的专业人士都很粗略

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

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

于 2012-07-21T05:13:25.247 回答
3

您必须在每个表中创建用作外键的所有列。这是最大的缺点。

于 2016-04-15T08:41:11.557 回答
2

缺点:

  • 必须在所有引用表中导入复合主键。这意味着更大的索引和要编写的更多代码(例如连接、更新)。如果您系统地使用复合主键,它可能会变得非常麻烦。
  • 您不能更新主键的一部分。例如,如果您使用 university_id、student_id 作为大学生表中的主键,并且一个学生更改了大学,您必须删除并重新创建记录。

优点:

  • 复合主键允许以强大且无缝的方式强制执行一种常见的约束。假设您有一个 UNIVERSITY 表、一个 STUDENT 表、一个 COURSE 表和一个 STUDENT_COURSE 表(哪个学生学习哪个课程)。如果约束条件是您必须始终是 A 大学的学生才能学习 A 大学的课程,那么如果 university_id 是 STUDENT 和 COURSE 的组合键的一部分,则该约束将被自动验证。
于 2015-09-03T11:54:24.193 回答