制作复合主键时什么时候会被认为是OVERKILL?

When will it be considered an OVERKILL when making a composite primary key?

最近翻阅数据库笔记时偶然发现了这个问题

在年度考试(A Levels、O Levels)的情况下,未达到预期分数的学生可以在接下来的几年中重考, 假设有一个专为学校设计的数据库具有以下属性

Student ID, Exam module, Exam Date, Exam Results

书中提供的问题(不是我个人的问题):合适的主键是什么?[5]

现在,我知道有几个主键不应该使用:

  1. 纯学号

  2. (学号+考试模块)

而且我也知道也许

  1. 人工主键 - 扩展第 5 列自动递增

  2. (学号 + 考试模块 + 考试日期)

可以作为主键

我的问题来自于从所有属性(学生 ID + 考试模块 + 考试日期 + 考试结果)制作复合主键。我的一部分认为它可以作为复合主键使用,但是为每个 table 提供一个由所有列组成的复合主键是没有意义的。

根据您对问题的描述,以下列的元组在整个 table 中应该是唯一的:(StudentID, ExamModule, ExamDate),因为学生可能在不同的日期(实际上:不同的年份)参加相同的考试).考试结果不应该是这个唯一列元组的一部分:这可以防止学生在同一考试中获得两个结果。

您是决定将这个列元组作为 table 的主键,还是使用某种串行列作为主键,主要取决于个人喜好。如果您使用序列号,则无论如何都需要在以上三列上放置一个复合唯一约束。

这不一定符合 OP 最初的问题:

Question: what would be some appropriate primary keys?

但是..(在后站点)我会使用 IDENTITY 字段作为主键。
并将 StudentID 作为索引(非唯一)和备用键。