一、函数依赖与码
若X->Y,即由X能确定Y,或者说一个已知的X能确定一个唯一的Y,则称Y依赖于Y(跟初中的函数定义一致)。
一个学生只能属于一个学院,即知道学号X,就能确定对应的学院代码Y,所以学院代码Y依赖于学号X。
1、部分函数依赖
Y由X中的部分即能确定,比如(学号,姓名)->(系主任),显然,只需(学号,姓名)里的学号就能确定系主任!因此:(系主任)部分函数依赖于(学号,姓名)
2、完全函数依赖(可对比部分函数依赖)
Y由X中的全部属性确定,比如(学号,课程号)->某科成绩,显然,因为一个学号一般有多个课程的成绩,即一个所以要查某科的成绩,需要同时知道学号和课程号。即:(某科成绩)完全函数依赖于(学号,课程号)。
3、传递函数依赖
学号->系,系->系主任
从上可知,系主任函数依赖于系,系函数依赖于学号,因此系主任传递依赖于学号
4、主码(主键)
主码中的属性叫做主属性,其他属性叫做非主属性。
比如:(学号,姓名,性别)中,学号为主码(主键),因此学号为主属性,姓名和性别是非主属性。
比如:(学号,课程号,成绩)中,(学号,课程号)为主键,因此学号和课程号为主属性,成绩为非主属性。
二、第一范式:1NF
表中的每个属性都是不可分割的原子项。
一张Excel表:

上面的部门不是原子项,不符合1NF!
注:在数据库中创建不了具有非原子项的表!即数据库中创建的表都满足1NF。
三、第二范式(2NF):在1NF的基础上
在(学号,姓名,课程号,成绩,系号,系主任)中,主键至少要包含学号和课程号(成绩得由学号和课程号共同确定),因此可选(学号,课程号)为主键。
因为主键是(学号,课程号),因此学号和课程号是主属性,姓名、成绩、系号和系主任是非主属性。成绩的确是完全函数依赖于主键,但系号不是(系主任和姓名同理),系号部分函数依赖于主键(由主键中的学号即可确定系号)。因此存在非主属性对主键的部分函数依赖。
如果把非主属性对主键的部分函数依赖消除了,或者说如果不存在非主属性对主键的部分函数依赖,那么就满足2NF。
把上面的(学号,姓名,课程号,成绩,系号,系主任)拆成两张表即可:(学号,姓名,系号,系主任),(学号,课程号,成绩),其中红色的属性为对应表的主键。
四、第三范式(3NF):在2NF的基础上
在上面的【三】中,我们把(学号,姓名,课程号,成绩,系号,系主任)拆成了(学号,姓名,系号,系主任)和(学号,课程号,成绩),这样就符合第二范式。但这样就完美了吗?当然不是!
仔细分析可以发现,(学号,姓名,系号,系主任)中的非主属性系主任依赖于非主属性系号,即非主属性之间存在函数依赖!
或者换一个角度:系主任依赖于系号,系号依赖于学号,即系主任传递依赖于学号,存在传递依赖!
如果消除了传递依赖,或者说消除了非主属性之间的函数依赖,那么就符合第三范式!
把(学号,姓名,系号,系主任)继续拆分,变成(学号,姓名)和(系号,系主任),/*其中红色的为主键*/,就符合3NF了。
五、其他
3NF往上是BCNF,BCNF往上是4NF,4NF往上是5NF。因为一般满足3NF就够了,故本文不对更严格的范式进行介绍。
1998

被折叠的 条评论
为什么被折叠?



