首先介绍几个概念:
函数依赖
定义:设X,Y是关系R的两个属性集合,当任何时刻R中的任意两个元组中的X属性值相同时,则它们的Y属性值也相同,则称X函数决定Y,或Y函数依赖于X。
理解:若在一张表中,属性或属性组X确定,必定能确定属性Y的值,则称Y函数依赖于X,记做X->Y.如下表,在学生表ST中通过学号能唯一确定一个姓名,则姓名函数依赖于学号
学生表ST
学号 | 姓名 | 性别 |
---|---|---|
1 | 张三 | 男 |
教师表T
TID (教师编号) | 姓名 | 性别 |
---|---|---|
1 | 李四 | 男 |
课程表SC
CID (课程号) | 课程名称 | TID(授课老师ID) | 学分 |
---|---|---|---|
1 | 数学 | 1 | 2 |
成绩表SG
学号 | CID(课程号) | 成绩 |
---|---|---|
1 | 1 | 80 |
平凡函数依赖&非平凡函数依赖
定义:设一个关系为R(U),X和Y为属性集U上的子集,若X→Y且X不包含Y,则称X→Y为非平凡函数依赖,否则若X包含Y则必有X→Y,称此X→Y为平凡函数依赖.
举例:在学生表ST中,学号总能函数决定它本身,记作“学号→学号”,对于任一个给定的学号,都有它本身的学号值唯一对应,此为平凡函数依赖.(学号,性别)->性别与(学号,性别)->学号也是平凡函数依赖
通常,我们主要讨论的是非平凡函数依赖:如学生表ST中学号函数决定的其他属性都是非平凡函数依赖
完全函数依赖
定义:设X,Y是关系R的两个属性集合,X’是X的真子集,存在X→Y,但对每一个X’都有X’!→Y,则称Y完全函数依赖于X。
理解:在一张表中,若 X → Y,且对于 X 的任何一个真子集(假如属性组 X 包含超过一个属性的话),X ' → Y 不成立,那么我们称 Y 对于 X 完全函数依赖。
举例:在成绩表SG中,成绩完全函数依赖于(学号,CID(课程号))
部分函数依赖
定义:设X,Y是关系R的两个属性集合,存在X→Y,若X’是X的真子集,存在X’→Y,则称Y部分函数依赖于X。
说明:假如 Y 函数依赖于 X,但同时 Y 并不完全函数依赖于 X,那么我们就称 Y 部分函数依赖于 X
举例:学生表ST中(学号,姓名)->性别,但是存在学号->性别,所以称性别部分依赖于(学号,姓名)
传递函数依赖
定义:设X,Y,Z是关系R中互不相同的属性集合,存在X→Y(Y !→X),Y→Z,则称Z传递函数依赖于X。
说明:假如 Z 函数依赖于 Y,且 Y 函数依赖于 X (严格来说还有一个X 不包含于Y,且 Y 不函数依赖于Z的前提条件),那么我们就称 Z 传递函数依赖于 X
举例:关系S1(学号,系名,系主任),学号 → 系名,系名 → 系主任,并且系名 !→ 学号,所以学号 → 系主任为传递函数依赖。
一范式
定义:符合1NF的关系中的每个属性都不可再分
说明:在一列中不能插入两个及以上不同属性的值
举例:如果将教师表的姓名与性别放在同一列就不符合1NF,当然这在建表的时候就不会成功。
二范式
定义:在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)。
说明:第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或记录必须可以被唯一地区分。选取一个能区分每个实体的属性或属性组,作为实体的唯一标识。即要有主键
举例:如果在成绩表SG中添加一列姓名变成下面这样,SG表的主键是学号加CID(课程号),(学号)->姓名,所以姓名部分函数依赖于(学号,CID(课程号)),不符合2NF
学号 | CID(课程号) | 成绩 | 姓名 |
---|---|---|---|
1 | 1 | 80 | 张三 |
三范式
定义:在1NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)
说明:第三范式(3NF)是第二范式(2NF)的一个子集,即满足第三范式(3NF)必须满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个关系中不包含已在其它关系已包含的非主关键字信息。
举例:如果在课程表SC中添加一列老师姓名,变成如下,存在
CID(课程号)->TID(授课老师ID),TID(授课老师ID)->教师姓名,TID(授课老师ID)!->CID(课程号),所以教师姓名传递函数依赖于CID(课程号),不满足3NF,但是满足2NF,主键是CID
CID (课程号) | 课程名称 | TID(授课老师ID) | 学分 | 教师姓名 |
---|---|---|---|---|
1 | 数学 | 1 | 2 | 李四 |