范式题先找候选键,再看非主属性
做范式题,第一步不是背 1NF、2NF、3NF 的定义,而是找候选键。候选键能唯一标识一条记录,后面判断部分依赖、传递依赖,都要围绕候选键展开。
找到候选键以后,再看非主属性是怎么被决定的。如果非主属性只依赖复合候选键的一部分,就是第二范式要处理的问题;如果非主属性通过另一个非主属性间接依赖候选键,就是第三范式要处理的问题。
| 范式 | 重点看什么 | 常见题眼 |
|---|---|---|
| 第一范式 | 属性是否原子 | 一个字段里不要塞多个值 |
| 第二范式 | 是否存在部分依赖 | 复合键中的一部分就能决定非主属性 |
| 第三范式 | 是否存在传递依赖 | 候选键决定 A,A 又决定 B |
| BCNF | 决定因素是否都是候选键 | 更严格的函数依赖要求 |
第二范式最怕“复合键只用了一半”
第二范式通常出现在复合候选键场景。比如选课关系中,主键可能是“学号 + 课程号”。成绩依赖学号和课程号一起确定,这很正常;但学生姓名只依赖学号,课程名称只依赖课程号,这就是部分依赖的味道。
如果题目给的是单属性候选键,通常就不会出现对复合键一部分的部分依赖。看到复合键时要格外敏感:非主属性到底是依赖整个键,还是只依赖其中一列?这是第二范式题的核心。
小例子
关系:选课(学号, 课程号, 姓名, 课程名, 成绩)。
成绩依赖学号和课程号组合,比较合理。
姓名只依赖学号,课程名只依赖课程号,这就是部分依赖风险。
第三范式最怕“非主属性决定非主属性”
第三范式关注传递依赖。比如学号决定系号,系号又决定系名,那么学号就通过系号间接决定了系名。系名不是直接围绕学号这个实体事实存在,而是跟系号绑定,这就容易带来冗余和更新异常。
老师讲第三范式时常说一句:非主属性不要替候选键继续当老板。也就是说,非主属性不应该再去决定另一个非主属性。只要看到这种“绕了一层”的决定关系,就要警惕传递依赖。
考场判断时,不要把所有冗余都叫第三范式
看到数据冗余,不等于一定是第三范式问题。先看是不是属性不原子,再看有没有部分依赖,最后再看传递依赖。范式判断有顺序,跳步很容易把第二范式的问题误判成第三范式。
复习时可以用一句话压住:2NF 管“非主属性别只依赖复合键的一部分”,3NF 管“非主属性别再决定非主属性”。这句话比单纯背定义更适合做选择题和下午题分析。
相关题目解析
下面这些题目和本专题的判断方法关联较强,适合读完概念后回到具体题干里校验理解。
- 软件设计师考试中第三范式主要看什么?数据库设计 / 第三范式
- ER 图一对多联系转换成关系表时外键放在哪里?ER 图 / 关系模式转换
- SQL 中 INNER JOIN 主要用来做什么?SQL / INNER JOIN