知识卡片
超码候选码主码的层层收窄逻辑
内容
超码、候选码、主码三个概念不是并列关系,而是层层收窄筛选出来的:超码是 “能唯一标识一个元组的属性集合”,这个标准很宽松——只要能唯一区分就算, 哪怕这个属性集里塞了多余的属性也不影响它成立(比如{学号,姓名}能唯一 标识学生,即使只用学号就够了);候选码在超码的基础上加了一条”最小性” 要求——不存在比它更小、依然能唯一标识的真子集,也就是把超码里所有”可以 删掉却不影响唯一性”的多余属性都去掉之后剩下的最简版本({学号}是候选码, {学号,姓名}不是,因为它有更小的、同样有效的子集);主码则是从候选码里 挑一个作为实际使用的标识(数据库系统建索引、排序等操作都依它进行)。 这条筛选链的价值在于理解”为什么不能随便选一堆属性当主码”——选超码而非 候选码当主码,会让唯一性约束比实际需要的更”重”,例如误把{学号,姓名}设为 主码,会导致同一学生改名时被数据库误判成两条不同记录的风险,而候选码本身 已经是能唯一标识的最小充分条件,不需要也不应该再叠加冗余属性。
参考来源
- 位置:《数据库原理(微课版)》第2章《关系数据库》2.1.4节"码"
(源文件:_epub-src/index_split_001.html)
- 结论依据:原文定义"如果关系中的某一个或几个属性的集合能唯一地标识一个
元组,则称该属性集为超码;如果不存在超码的真子集,使其能唯一识别一个
元组,则称之为候选码",并举例说明{ID,name}是超码但非候选码(因其真
子集{ID}已能唯一标识),因此可以推出三者层层收窄的筛选逻辑。
- 原始内容:如果关系中的某一个或几个属性的集合能唯一地标识一个元组,则
称该属性集为超码;如果不存在超码的真子集,使其能唯一识别一个元组,则
称之为候选码……如果一个关系有多个候选码,选定其中一个作为主码使用。