制作复合主键时,何时会被视为 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?的主要内容,如果未能解决你的问题,请参考以下文章
ORA-01400: 当使用 @onetomany 映射并且在子端具有复合主键时,无法将 NULL 插入
Hibernate:insertable = false,updatable = false 属于涉及外键的复合主键星座中的哪里?