先找能不能唯一确定一行记录
判断候选键时,不要一上来就问“哪个字段像主键”。考试题更关心函数依赖关系。比如学生表里,学号可以确定姓名、班级、专业等属性,那么学号就有成为键的可能。如果某个属性集合的闭包能够推出关系模式中的全部属性,它至少是一个超键。
接着再看最小性。候选键不是越大越好,而是不能再删。比如 {学号, 姓名} 能确定全部属性,但如果单独的学号已经能确定全部属性,那么 {学号, 姓名} 就不是候选键,只能说是超键。很多同学在这里丢分,就是只看“能确定”,忘了看“最小”。
| 概念 | 判断重点 | 老师提醒 |
|---|---|---|
| 超键 | 能唯一确定一条记录 | 可能包含多余属性 |
| 候选键 | 能唯一确定记录,并且没有多余属性 | 关键词是最小超键 |
| 主键 | 从候选键中选出来作为主要标识 | 一个关系通常选一个主键 |
| 外键 | 引用另一个关系的主键或候选键 | 重点是表与表之间的参照关系 |
主键不是天生的,是从候选键里选出来的
候选键可能不止一个。比如用户表中,用户编号可以唯一识别用户,身份证号也可以唯一识别用户,这两个都可能是候选键。数据库设计时通常会从候选键里选一个更稳定、更短、更适合引用的属性作为主键。
所以主键和候选键的关系可以这么理解:候选键是候选人,主键是最后被选中的那一个。主键值通常要求唯一且非空,用来可靠标识表中的每一行。软考选择题如果问“唯一标识元组”,优先想到主键;如果问“所有能够唯一标识元组的最小属性组”,就要想到候选键。
一个小例子
关系模式 Student(学号, 身份证号, 姓名, 班级)。
如果学号和身份证号都能分别确定全部属性,它们都可以是候选键。
设计时选择学号作为主键,身份证号仍然可以设置唯一约束,但它不一定是主键。
外键看的不是自己唯一,而是引用别人不能乱指
外键经常和主键一起出现,但它解决的是另一类问题。订单表中的客户编号,不是为了唯一标识订单,而是为了说明这个订单属于哪个客户。它引用客户表里的客户编号,保证订单不能引用一个不存在的客户,这就是参照完整性的典型场景。
考试里看到“客户表、订单表”“学生表、选课表”“部门表、员工表”这种跨表关系,要先判断谁引用谁。主键保证自己这张表的记录能被识别,外键保证引用别人的记录不能乱指。把这两句话分清,很多完整性约束题就不会混。
| 题干信号 | 优先想到 | 不要误判为 |
|---|---|---|
| 唯一标识一条记录 | 主键 | 外键 |
| 多个属性都能唯一确定记录 | 候选键 | 普通索引 |
| 子表字段必须来自父表已有记录 | 外键 | 实体完整性 |
| 主键不能为空且不能重复 | 实体完整性 | 参照完整性 |
备考时把键和范式放在一起复习
候选键不是孤立考点。后面的主属性、非主属性、第二范式、第三范式,都要先知道候选键是什么。比如“非主属性完全函数依赖于候选键”这句话,如果候选键没找对,后面判断 2NF、3NF 基本都会跟着错。
建议做数据库规范化题时按这个顺序走:先列函数依赖,再求属性闭包,再找候选键,最后判断主属性、非主属性和范式层次。这个顺序慢一点,但稳。考试里数据库题最怕凭感觉,尤其不要把“看起来像编号”的字段直接当答案。
相关题目解析
下面这些题目和本专题的判断方法关联较强,适合读完概念后回到具体题干里校验理解。
- 函数依赖中属性闭包怎么求?属性闭包 / 函数依赖
- 数据库表中的主键为什么不能重复也不能为空?主键 / 实体完整性
- 外键约束为什么能维护参照完整性?外键约束 / 参照完整性
- ER 图一对多联系转换成关系表时外键放在哪里?ER 图 / 关系模式转换