数据库系统原理:第二范式(数据库第一第二第三范式)
关系模式满足的约束条件称为范式,范式由低到高分为1NF、2NF、3NF、BCNF等。
学习什么是2NF。

一、候选键概念回顾
超键:能唯一标识元组的属性集。
候选键(码):不含有多余属性的超键(最小的超建)。
主键(主码):用户选作元组标识的一个候选键(是唯一的,多个候选键中确定一个是主键。)。
主属性:包含在任何一个候选键中的属性。
非主属性:不包含在任何一个候选键中的属性。
二、第二范式(2NF)定义
给定关系模式R及其上的函数依赖集F,如果R的任何一个非主属性都完全依赖于它的每一个侯选关键字,则称R是第二范式,简记为2NF。
例1:已知R(U, F),U=(ABCD), F={AB→C,C→D} ,判断R属于第几范式。
判断候选键需要根据给出的已知函数依赖关系来判断:AB→C、C→D,根据传递性可以得出AB→D;那么AB可以决定C、也可以决定D,AB就满足候选键的定义。AB合在一起决定C、也合在一起决定D,那么不存在部分函数依赖关系。因此:
R中的候选码为:AB
R为:2NF
为了判断关系模式满足的约束条件,确定候选码是很重要的。那么怎么去确定关系模式中的候选键(码)?
如果没有给出函数依赖集,那么需要根据语义来确定。
如果给出了关系模式的函数依赖集,可以采用以下三个启发式规则来帮助判断:
(1)如果有属性不在函数依赖集中出现,那么它必须包含在候选码中;
(2)如果有属性不在函数依赖集中任何函数依赖的右边出现,那么它必须包含在候选码中;
(3)如果该属性或属性组能够唯一的标识元组,则它就是候选码。
例2 :SCT (SNO, CNO, CNAME, GRADE, TNAME, SALARY)
F= {(SNO, CNO) →GRADE, CNO→CNAME, CNO→TNAME, TNAME→SALARY}
关系模式SCT由学号、课程号、课程名、成绩、教师名、教师的工资这六个属性组成,其中函数依赖关系:学号和课程号一起决定了课程的成绩、课程号可以决定课程名、课程号可以决定教师名(这就意味着一门课只有一名教师)、教师名可以决定教师的工资。
首先需要确定候选键:根据前面的启发性工资可以看看:
是否有属性没有出现在函数依赖关系中:例2中的所有属性都出现在函数依赖关系中;
是否有属性没有出现在任何函数依赖的右边的:所有函数依赖的右边的属性有四个,只有学号和课程号没有出现在函数依赖的右边,因此它们一定是候选键;
学号和课程号能否唯一地确定元组:学号和课程号可以决定成绩、也可以决定成绩、也可以决定课程名、也可以决定教师名、也可以决定教师的工资。因此,学号和课程号一起作为候选键。
判断该关系模式属于第几范式:关系模式SCT中存在部分函数依赖关系CNO->CNAME,候选键是学号和课程号,而其中的一个属性课程号就决定了另一个属性,因此存在着部分函数依赖,那么就属于NF。
候选码:(SNO, CNO)
SCT为:1NF
在1NF的情况下,会存在以下四个问题:
?冗余度高 ?插入问题
?修改困难 ?删除问题
SCT(SNO, CNO, CNAME, GRADE,TNAME, SALARY)
异常原因:存在非主属性CNAME部分函数依赖于侯选键(SNO, CNO)。
解决异常的方法:采用投影分解把一个关系模式SCT分解为两个关系模式。(即去除掉部分函数依赖。)
分解:SC(SNO,CNO,GRADE)
CT (CNO, CNAME, TNAME, SALARY)
可以看到在第一个关系模式SC中,满足2NF的定义;在第二个关系模式CT中,也满足2NF的定义,都没有部分函数依赖。
分解后得到的两个关系模式均为2NF。
观察:CT(CNO ,CNAME, TNAME, SALARY)
关系模式CT是一个满足2NF的关系模式:在CT中它的候选键的单属性的;如果是单属性的话,就不会存在部分函数依赖的关系了,一定是满足2NF的。
结论:若R∈1NF,且R中所有候选码都是单属性,则R∈2NF。
因为若R中所有候选码均为单属性,就不可能存在某个非主属性部分函数依赖于候选键,此时1NF必为2NF。
三、2NF存在的问题
问题:分解为2NF后,是否都不存在前述的四种异常(冗余,插入、删除、修改异常)?
SC(SNO,CNO,GRADE)
CT (CNO, CNAME, TNAME, SALARY)
在SC中,不存在上述的四种问题;但在CT中,仍然存在着前述的四种问题:比如说插入异常,如果教师被安排授课的话,就不会被插入到模式CT里;删除异常,如果删除掉一门课,可能把教师的信息也一起删除了。
这说明从1NF分解到2NF还不够好,原因是在CT中存在传递依赖,所以需要进一步地去做分解。
四、总结
关系模式中存在不同程度的函数依赖,用范式来表示属性间依赖的程度,范式是评价关系模式好坏的标准。
关系模式满足的最低要求是1NF,如果消除了非主属性对侯选码的部分函数依赖,1NF就能转化为2NF。
规范化就是将低级范式的关系模式分解为高级范式的关系模式的一个过程。