本文仅供参考学习使用,谢谢
函数依赖部分
第一范式(1NF)
第二范式(2NF)
第三范式(3NF)
BC范式(BCNF,Boyce和Codd共同提出的范式)
第四范式(4NF)
第五范式(5NF)
一个低一级范式的关系模式,通过模式分解 (schema decomposition)可以转换为若干个 高一级范式的关系模式的集合,这种过程就叫 规范化(normalization)。
定义:
如果一个关系模式R的所有属性都是不可分的基本数据项,则R∈1NF。
PS:第一范式是对关系模式的最起码的要求。不满足第一范式的数据库模式 不能称为关系数据模式。
定义:
若关系模式R∈1NF,并且每一个非主属性都 完 全 函 数 依 赖 于 ‾ \underline{完全函数依赖于} 完全函数依赖于完全函数依赖于R的 码(候选键),则R∈2NF。
说白了就是非主属性完全函数依赖于候选键,需要将部分函数依赖的非主属性通过投影分解消除
S-L-C( S n o , C n o , ‾ \underline{Sno, Cno,} Sno,Cno, Sdept, Sloc, Grade) ∈ \in ∈ 1NF
S-L-C( S n o , C n o , ‾ \underline{Sno, Cno,} Sno,Cno, Sdept, Sloc, Grade) ∉ \notin ∈/ 2NF
非主属性 Sdept 和 Sloc 部分函数依赖于码(Sno, Cno)。
一个关系模式R不属于2NF,就会产生问题
例如S-L-C存在的问题:
//假设Sno=2014102,Sdept=IS,Sloc=N的学生还未选课,因课程号是主属性,因此该学生的信息无法插入SLC。
Sno Sdept Sloc Cno Grade
2014101 IS N 3 89
2014101 IS N 2 97
2014101 IS N 5 88
2014103 IS N 1 86
2014103 IS N 3 92
2014104 IS N 3 79
2014102 IS N null null
//假定2014104学生只选修了3号课程这一门课。现在因身体不适,他连3号课程也不选修了。因课程号是主属性,此操作将导致该整个元组的删 除。这样,2014104学生信息都被删除了。
Sno Sdept Sloc Cno Grade
2014101 IS N 3 89
2014101 IS N 2 97
2014101 IS N 5 88
2014103 IS N 1 86
2014103 IS N 3 92
2014104 IS N 3 79
//如果要删除2014104选修的三号课程的记录将会导致该学生信息全被删除
//如果一个学生选修了8门课程,那么他的Sdept和Sloc值就要重复存储了8次。
Sno Sdept Sloc Cno Grade
2014101 PISH NS 3 89
2014101 PISH NS 2 97
2014101 PISH NS 5 88
2014103 IS N 1 86
2014103 IS N 3 92
2014104 IS N 3 79
2014101 PISH NS 1 72
2014101 PISH NS 4 65
2014101 PISH NS 6 99
2014101 PISH NS 7 83
2014101 PISH NS 8 75
例如学生转系,在修改此学生元组的Sdept值的同时,还可能需要修改住处(Sloc)。如果这个学生选修了K门课,则必须无遗漏地修改K个元组中全部Sdept、Sloc信息。
原因分析: SLC(Sno, Sdept, Sloc, Cno, Grade) 中
Sdept、 Sloc部分函数依赖于码。SLC的码为(Sno, Cno)
解决方法:
实际上就是将部分函数依赖通过分解关系的方式化为完全函数依赖
采用投影分解法,把S-L-C分解为两个关系模式,消除这些部分函数依赖
即为将SLC关系分解为:
SC(Sno, Cno, Grade)
S-L(Sno, Sdept, Sloc)
- 关系模式SC的码为(Sno, Cno),关系模式S-L的码为Sno
- 非主属性对码都是完全函数依赖了。他们都是2NF。
- 从而使上述四个问题在一定程度上得到了一定的解决。
2NF还有什么问题?
问题分析:
Sloc传递函数依赖于Sno,即S-L中存在非主属性传递对码的传递函数依赖
Sno → (传递) Sloc 。
S-L关系存在的问题:
如果某个系因种种原因(例如刚刚成立),目前暂时没有 在校学生,我们就无法把这个系的信息,如 MA, S 存入数据库。
Sno Sdept Sloc
2014101 IS N
2014102 IS N
2014103 IS N
2014104 IS N
null MA S //该条无法插入
如果某个系(如IS)的学生全部毕业了,我们在删除该系学生信息的 同时,把这个系的信息,如IS, N,也丢掉了。
Sno Sdept Sloc
2014101 IS N //前四条记录会被直接删除
2014102 IS N
2014103 IS N
2014104 IS N
2014105 PH S
2014106 PH S
每一个系的学生都住在同一个地方,关于系的住处的信息却重复出现,重复次数与该系学生人数相同。
Sno Sdept Sloc
2014101 IS N
2014102 IS N //重复
2014103 IS N //重复
2014104 IS N //重复
2014105 PH S
2014106 PH S //重复
2014107 PH S //重复
2014108 PH S //重复
Sno Sdept Sloc
2014101 IS N
2014102 IS N //修改为S时重复
2014103 IS N //修改为S时重复
2014104 IS N //修改为S时重复
2014105 PH S
2014106 PH S
2014107 PH S
2014108 PH S
原因分析:
S-L中Sloc传递函数依赖于Sno
即:非主属性 传递函数依赖 码
解决方法:
采用投影分解法,把S-L分解为两个关系模式,以消除传递函数依赖:
S-D( Sno, Sdept )
D-L( Sdept, Sloc )
S-D的码为Sno,D-L的码为Sdept
在分解后的关系模式中既没有非主属性对码的部分函数依赖, 也没有非主属性对码的传递函数依赖,进一步解决了上述四个问题。
定义:
关系模式R∈1NF, 若R中不存在这样的码X、属性组Y及非主属性Z (Z ⊄ \not\subset ⊂ Y) ,使得X→Y,Y→Z,Y↛X,成立,则称R ∈ 3NF
实际上就是在第二范式(消除部分函数依赖的基础上)消除传递函数依赖
要求满足非主属性 不 传递函数依赖于候选键
S-D(Sno, Sdept) ∈ \in ∈ 3NF
D-L(Sdept,Sloc) ∈ \in ∈ 3NF
S-L 不存在部分函数依赖,但是存在传递函数,所以
S-L(Sno, Sdept, Sloc) ∈ \in ∈ 2NF
S-L(Sno, Sdept, Sloc) ∉ \notin ∈/ 3NF
3NF的一些性质:
每一个非主属性
既不部分函数依赖于候选码也不一定程度上
解决原2NF关系中存在的插入异常、删除异常、数据冗余 度大、修改复杂等问题。并不能完全消除
关系模式 中的各种异常情况和数据冗余。关系模式STJ(S,T,J)中,S表示学生,T表示教师,J表示课程
语义:
假设每一教师只教一门课 T→J
每门课由若干教师教,但某一学生选定某门课,就确定了一个固定的教师 (S,J)→T
某个学生选修某个教师的课就确定了所选课的名称 (S,T)→J
T→J ,(S,J)→T, (S,T)→J
虽然STJ(S,T,J)∈3NF,但它仍存在增删改等异常,还不是一个理想的关系模式。
原因:
主属性J部分依赖于码(S, T)。因为T→J
解决方法:
采用投影分解法,将STJ分解为二个关系模式:SJ(S,J);TJ(T,J)
在分解后的关系模式中没有任何属性对码的部分函数依赖和传递函数依赖。它解决了上述四个问题:
(1) TJ关系中可以存储所开课程尚未有学生选修的教师信息。
(2) 选修过某门课程的学生全部毕业了,只是删除SJ关系中的相应元组,不会影响TJ关系中相应教师开设该门课程的信息。
(3) 关于每个教师开设课程的信息只在TJ关系中存储一次。
(4) 某个教师开设的某门课程改名后,只需修改TJ关系中的一个相应元组即可。
BCNF(Boyce Codd Normal Form)是由Boyce和Codd提出的,比3NF更进了一步。通常认为BCNF是修正的第三范式,有时也称为扩展的第三范式。
BCNF的定义:
设关系模式R∈1NF,如果对于R的每个函数依赖X→Y,且X ⊇ Y 时,X必含有码,那么R∈BCNF。
即,在关系模式R中,如果每一个决定因素都包含码,则R∈BCNF。
STJ(S,T,J)∈ 3NF //T→J ,(S,J)→T, (S,T)→J
SJ(S,J)∈ BCNF //SJ的码为(S,J), all-key
TJ(T,J)∈ BCNF //TJ的码为T, T→J
BCNF的关系模式所具有的性质
1.所有非主属性对每一个码都是完全函数依赖。
2.所有主属性对每一个不包含它的码也是完全函数依赖。
3.没有任何属性完全函数依赖于非码的任何一组属性。
关系模式规范化的基本步骤:
消除决定因素 非码 的 非平凡函数依赖
1NF
↓ 消除非主属性对码的部分函数依赖
2NF
↓ 消除非主属性对码的传递函数依赖
3NF
↓ 消除主属性对码的部分和传递函数依赖
BCNF
↓ 消除非平凡且非函数依赖的多值依赖
4NF
↓ 消除非候选码所蕴含的连接依赖
5NF
HOW:
原则上要
所以在下面例子中 将传递函数依赖 A→D (A→C , A→D) 化为两个关系 (A,C) (C,D)
规范化的基本思想: