制作复合主键时,何时会被视为 OVERKILL?

Posted

技术标签:

【中文标题】制作复合主键时,何时会被视为 OVERKILL?【英文标题】:When will it be considered an OVERKILL when making a composite primary key? 【发布时间】:2019-12-18 20:12:00 【问题描述】:

最近,我在查看数据库笔记时偶然发现了这个问题。

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

Student ID, Exam module, Exam Date, Exam Results

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

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

    纯学生证

    (学生证+考试模块)

我也知道也许

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

    (学生证 + 考试模块 + 考试日期)

可以用作主键

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

【问题讨论】:

感谢您帮助编辑我的语法/句子结构! :) 【参考方案1】:

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

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

【讨论】:

感谢您的及时回复并回答了我的疑问!非常感谢:D【参考方案2】:

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

问题:什么是合适的主键?

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

【讨论】:

感谢您的意见 :)) 意义重大!

以上是关于制作复合主键时,何时会被视为 OVERKILL?的主要内容,如果未能解决你的问题,请参考以下文章

当该列属于Spring中的复合主键时如何按一列过滤

ORA-01400: 当使用 @onetomany 映射并且在子端具有复合主键时,无法将 NULL 插入

休眠仅保存具有复合主键中的父外键的子表条目

mysql 索引

Hibernate:insertable = false,updatable = false 属于涉及外键的复合主键星座中的哪里?

metaData.getPrimaryKeys() 当键是复合的时返回单行