数据库设计 · 候选键/主键/外键 · 关系模型

候选键、主键和外键怎么区分?

数据库键这一块,最容易出现一种情况:名词都背过,但一到题目里就不知道先看谁。老师讲这类题,一般不会让你先背定义,而是先找一件事:这个属性集合能不能唯一确定一行记录。能唯一确定,再看是不是最小;确定了候选键,再选一个作为主键;如果它拿来引用别的表,那才是外键。

数据库系统工程师专题 软考题库编辑部 持续更新

先找能不能唯一确定一行记录

判断候选键时,不要一上来就问“哪个字段像主键”。考试题更关心函数依赖关系。比如学生表里,学号可以确定姓名、班级、专业等属性,那么学号就有成为键的可能。如果某个属性集合的闭包能够推出关系模式中的全部属性,它至少是一个超键。

接着再看最小性。候选键不是越大越好,而是不能再删。比如 {学号, 姓名} 能确定全部属性,但如果单独的学号已经能确定全部属性,那么 {学号, 姓名} 就不是候选键,只能说是超键。很多同学在这里丢分,就是只看“能确定”,忘了看“最小”。

概念判断重点老师提醒
超键能唯一确定一条记录可能包含多余属性
候选键能唯一确定记录,并且没有多余属性关键词是最小超键
主键从候选键中选出来作为主要标识一个关系通常选一个主键
外键引用另一个关系的主键或候选键重点是表与表之间的参照关系

主键不是天生的,是从候选键里选出来的

候选键可能不止一个。比如用户表中,用户编号可以唯一识别用户,身份证号也可以唯一识别用户,这两个都可能是候选键。数据库设计时通常会从候选键里选一个更稳定、更短、更适合引用的属性作为主键。

所以主键和候选键的关系可以这么理解:候选键是候选人,主键是最后被选中的那一个。主键值通常要求唯一且非空,用来可靠标识表中的每一行。软考选择题如果问“唯一标识元组”,优先想到主键;如果问“所有能够唯一标识元组的最小属性组”,就要想到候选键。

一个小例子

关系模式 Student(学号, 身份证号, 姓名, 班级)。

如果学号和身份证号都能分别确定全部属性,它们都可以是候选键。

设计时选择学号作为主键,身份证号仍然可以设置唯一约束,但它不一定是主键。

外键看的不是自己唯一,而是引用别人不能乱指

外键经常和主键一起出现,但它解决的是另一类问题。订单表中的客户编号,不是为了唯一标识订单,而是为了说明这个订单属于哪个客户。它引用客户表里的客户编号,保证订单不能引用一个不存在的客户,这就是参照完整性的典型场景。

考试里看到“客户表、订单表”“学生表、选课表”“部门表、员工表”这种跨表关系,要先判断谁引用谁。主键保证自己这张表的记录能被识别,外键保证引用别人的记录不能乱指。把这两句话分清,很多完整性约束题就不会混。

题干信号优先想到不要误判为
唯一标识一条记录主键外键
多个属性都能唯一确定记录候选键普通索引
子表字段必须来自父表已有记录外键实体完整性
主键不能为空且不能重复实体完整性参照完整性

备考时把键和范式放在一起复习

候选键不是孤立考点。后面的主属性、非主属性、第二范式、第三范式,都要先知道候选键是什么。比如“非主属性完全函数依赖于候选键”这句话,如果候选键没找对,后面判断 2NF、3NF 基本都会跟着错。

建议做数据库规范化题时按这个顺序走:先列函数依赖,再求属性闭包,再找候选键,最后判断主属性、非主属性和范式层次。这个顺序慢一点,但稳。考试里数据库题最怕凭感觉,尤其不要把“看起来像编号”的字段直接当答案。

相关题目解析

下面这些题目和本专题的判断方法关联较强,适合读完概念后回到具体题干里校验理解。