关系模式五元组
R<U,D,DOM,F>
R--关系名
U--属性(组)
D--U中的属性所来自的域
DOM--属性到域的映射
F--U中的数据依赖(函数依赖、多值依赖、连接依赖等)
数据依赖不良会带来的危害
数据冗余
更新异常
插入异常
删除异常
函数依赖
概念 X,Y是R的子集,不存在任意两个元组在X上的取值相等,而在Y上的取值不等,称Y函数依赖于X,记作X→Y。
关系举例 Student(Sno,Sname,Cno,Cname,Sdept,Dept_manager,Grade)
理解 不存在同一个X有多个Y。Sno→Sdept,Sdept→Dept_manager
分类
平凡的函数依赖 X→Y, Y?X。(Sno,Sname) →Sname/*无意义,不讨论*/
非平凡的函数依赖 X→Y, Y?X。Sno→Sname
相互函数依赖 X→Y, Y→X。Sno→Sname, Sname→Sno/*适用于不允许重名的情况*/
完全函数依赖 X→Y, Y不依赖于X的任一真子集。
部分函数依赖 X→Y, Y亦可依赖于X的某一真子集。
传递函数依赖 X→Y, Y不依赖于Z, Y→Z。
码
候选码 对于R<U,F>,U中有子集K,且,则K为候选码
主码 有多个候选码时,选一个作为主码
主属性 任意一个候选码中的属性,均为主属性
全码 U不存在子集候选码,U唯一确定自身,则为全码
多值依赖
定义
对于R<U,F>,U有子集X,Y,Z,且Z=U-X-Y,如果对于给定的t(X,Z)值,对应的一组Y值的取值只与X值有关,而与Z值的变化无关,则称Y多值依赖于X,记作X→→Y
如果Z为空值,则称平凡的多值依赖
举例
Teaching(Course, Teacher, Course_Book)
/*课程-老师-教材书*/
理解
一个老师可以带多门课程,一本教材可以被多个课程使用(如《数据结构》可被数学、计算机使用),解决了2NF的传递依赖
每门课程有固定的一群老师,有固定的使用教材书,所以同一个课程,同一本教材所对应的老师组,不会因为教材而改变
性质
对称性:若X→→Y,则X→→Z
传递性:若X→→Y, Y→→Z,则X→→Z-Y
函数依赖是特殊的多值依赖
若X→→Y,X→→Z,则X→→YZ,X→→Y∩Z,X→→Y-Z,X→→Z-Y
1NF
定义 R<U,F>中每一个分量必须是不可再分的数据项
2NF
定义 R<U,F>∈1NF,且每一个非主属性完全依赖于任何一个候选码
理解 不能存在部分依赖于任一候选码的非主属性
反例 S-L-C(Sno, Sdept, Cno, Cname, Grade)
理解 候选码:(Sno,Cno)
因为Sno→Sdept,所以非主属性Sdept部分依赖于候选码(Sno, Cno)
3NF
定义 非主属性不可传递函数依赖于任一候选码
理解 非主属性之间不可有依赖关系
反例 S-L(Sno, Sdept, SAddress) /*SAddress为学生宿舍楼号,一个系一栋楼*/
理解 候选码:Sno
因为Sno→Sdept, Sdept→SAddress,所以
BCNF
定义 R<U,F>∈1NF,若X→Y且Y?X时,X必包含候选码
其他 由Boyce, Codd提出,在第三范式的基础上改进,故也称修正的第三范式/扩充的第三范式
理解 所有的非平凡函数依赖的决定属性(组)必须包含候选码
反例 STC(Student, Teacher, Course) /*每个老师教一门课,每门课由多个老师教,每个学生选多个课程*/
理解 候选码(Student, Teacher, Course)
因为Teacher→Course,但是Teacher不是候选码
4NF
定义 R<U,F>∈1NF,如果对于R的每个非平凡多值依赖X→→Y(Y?X),X必包含候选码
理解 所有非平凡多值依赖的决定属性(组)必须包含候选码
反例 WSC(Warehouse, Saver, Commodity) /*仓库,保管员,商品*/
理解 Warehouse→→Saver,但是Warehouse不是候选码