一.问题的提出
一个关系模式应该是一个五元组
R
(
U
,
D
,
D
O
M
,
F
)
R(U,D,DOM,F)
R(U,D,DOM,F)
这里:
–关系名R是符号化的元组语义。
–U为一组属性。
–D为属性组U中的属性所来自的域
–DOM为属性到域的映射
–F为属性组U上的一组数据依赖
人们已经提出了许多种类型的数据依赖,其中最重要的是函数依赖和多值依赖。
例题:
建立一个描述学校教务的数据库,该数据库涉及的对象包括学生的学号,所在系,系主任姓名,课程号和成绩。假设用一个单一的关系魔术师来表示,则该关系模式的属性集合为:
U={Sno,Sdept,Mname,Cno,Grade}
得到的函数依赖是:
F={
S
n
o
→
S
d
e
p
t
Sno \rightarrow Sdept
Sno→Sdept,
S
d
e
p
t
→
M
n
a
m
e
Sdept \rightarrow Mname
Sdept→Mname,
(
S
n
o
,
C
n
o
)
→
G
r
a
d
e
(Sno,Cno) \rightarrow Grade
(Sno,Cno)→Grade}
但是这样单一的一个表会出现很多问题:
比如说:数据冗余,更新异常,插入异常,删除异常。
这是因为这个模式的数据依赖存在一些不好的性质。把他改造一下得到
S(Sno,Sdept,
S
n
o
→
S
d
e
p
t
Sno \rightarrow Sdept
Sno→Sdept);
SC(Sno,Cno,Grade,
(
S
n
o
,
C
n
o
)
→
G
r
a
d
e
(Sno,Cno) \rightarrow Grade
(Sno,Cno)→Grade);
DEPT(Sdept,Mname,
S
d
e
p
t
→
M
n
a
m
e
Sdept \rightarrow Mname
Sdept→Mname);
二.规范化
1.函数依赖
1.
x
→
y
x \rightarrow y
x→y,但
y
⊈
x
y \nsubseteq x
y⊈x,则称
x
→
y
x \rightarrow y
x→y是非平凡的函数依赖。
2.
x
→
y
x \rightarrow y
x→y,但
y
⊆
x
y \subseteq x
y⊆x,则称
x
→
y
x \rightarrow y
x→y是平凡的函数依赖。对于任意关系模式,平凡函数依赖是必然成立的,它不反映新的语义。
3.若
x
→
y
x \rightarrow y
x→y,则x称为这个函数依赖的决定属性组,也称为决定因素
4.若
x
→
y
x \rightarrow y
x→y,
y
→
x
y \rightarrow x
y→x,则记做
x
←
→
y
x \leftarrow\rightarrow y
x←→y
5.若y不函数依赖于x,则记做
x
↛
y
x \nrightarrow y
x↛y
定义6.2:
在R(U)中,如果
x
←
y
x \leftarrow y
x←y,并且对于x的任意一个真子集x1,都有
x
1
↛
y
x1 \nrightarrow y
x1↛y,则称y对x完全函数依赖,记做
X
→
F
Y
X \overset F \rightarrow Y
X→FY
定义6.3:
在R(U)中,如果
x
↛
y
x \nrightarrow y
x↛y(
y
⊈
x
y \nsubseteq x
y⊈x),
y
↛
x
y \not\rightarrow x
y→x,
y
↛
z
y \nrightarrow z
y↛z,
z
⊈
y
z \nsubseteq y
z⊈y则称z对x传递函数依赖。记为
x
⟶
传
递
y
x \overset {传递} \longrightarrow y
x⟶传递y。
2.码
定义6.4
设K为R<U,F>中的属性或属性组合。若K → U,则K称为R的一个候选码
如果U部分函数依赖于K,即K → U,则K称为超码。
候选码是最小的超码,即K的任意真子集都不是候选码。
若关系模式R有多个候选码,则选定其中的一个做为主码。
包含在任何一个候选码中的属性 ,称为主属性,不包含在任何码中的属性称为非主属性。
整个属性组是码,称为全码。
3.范式
对于各种范式之间的关系有
5
N
F
⊂
4
N
F
⊂
B
C
N
F
⊂
3
N
F
⊂
2
N
F
⊂
1
N
F
5NF \subset 4NF \subset BCNF \subset 3NF \subset 2NF \subset 1NF
5NF⊂4NF⊂BCNF⊂3NF⊂2NF⊂1NF
4.2NF
例6.4 有关系模式S-L-C(Sno,Sdept,Sloc,Cno,Grade)。其中Sloc为学生的住处,并且每个系的学生住在同一个地方。则函数依赖:
(
S
n
o
,
C
n
o
)
→
F
G
r
a
d
e
(Sno,Cno) \overset F \rightarrow Grade
(Sno,Cno)→FGrade
S
n
o
→
S
d
e
p
t
Sno \rightarrow Sdept
Sno→Sdept ,
(
S
n
o
,
C
n
o
)
→
p
S
d
e
p
t
(Sno,Cno) \overset p \rightarrow Sdept
(Sno,Cno)→pSdept
S
n
o
→
S
l
o
c
Sno \rightarrow Sloc
Sno→Sloc,
(
S
n
o
,
C
n
o
)
→
p
S
l
o
c
(Sno,Cno) \overset p \rightarrow Sloc
(Sno,Cno)→pSloc,
S
d
e
p
t
→
S
l
o
c
Sdept \rightarrow Sloc
Sdept→Sloc(每个系的学生只住在同一个地方)
一个关系如果不属于2NF,就会产生以下几个问题:
(1)插入异常。如果要插入一个学生但是这个学生还没有选课那么就无法插入,这样不符合需求
(2)删除异常。如果某个学生只选了一门课,如果这门课他决定不选了那么这个课程就要删除,因为课程是主属性所以删除了它那么整个元组都会删除,从而造成删除异常。
(3)修改复杂。修改的数据重复如果要修改一个数据时那么要连续修改许多次。
解决这些问题那么达到2NF
5.3NF
定义6.7:
设关系模式R<U,F>属于1NF,若R中不存在码X,属性组Y及非属性z使得
x
→
y
x \rightarrow y
x→y,
y
→
z
y \rightarrow z
y→z成立,
y
↛
x
y \nrightarrow x
y↛x,则称R<U,F>属于3NF。
也就是要达到3NF的话就必须在2NF的基础上去除传递函数依赖
6.BCNF
BC范式通常认为是修正的第三范式,在第三范式的条件上添加了一些条件
定义6.8:
关系模式R<U,F>中,若
x
→
y
x \rightarrow y
x→y且
y
⊄
x
y \not\subset x
y⊂x时必包含码,则
R
<
U
,
F
>
⊄
B
C
N
F
R<U,F> \not\subset BCNF
R<U,F>⊂BCNF
也就是说,关系模式R<U,F>中,若每一个决定因素都包含码,则
R
<
U
,
F
>
⊂
B
C
N
F
R<U,F> \subset BCNF
R<U,F>⊂BCNF。
一个满足BCNF的关系有:
1.所有非主属性对每一个码都是完全函数依赖。
2.所有主属性对每一个不包含它的码也是完全函数依赖。
3.没有任何属性完全函数依赖与非码的任何一组属性。
7.多值依赖
定义6.9:
设R(U)是属性集U上的一个关系模式。X,Y,Z是U的子集,并且Z=U-X-Y。
关系模式R(U)中多值依赖
X
→
→
Y
X \rightarrow\rightarrow Y
X→→Y 成立,当且仅当对R(U)的任一关系r,给定的一对(x,z)值,有一组Y的值,这组值仅仅决定于x值而于z的值无关。
多值依赖具有对称性: 若 X → → Y X \rightarrow\rightarrow Y X→→Y,则 X → → Z X \rightarrow\rightarrow Z X→→Z,其中Z=U-X-Y。
多值依赖具有传递性: 若 X → → Y X \rightarrow\rightarrow Y X→→Y, Y → → Z Y \rightarrow\rightarrow Z Y→→Z,则 X → → Z X \rightarrow\rightarrow Z X→→Z。
8.4NF
4NF是在BCNF的基础上增加一个条件。不允许出现非平凡且非函数的多值依赖。
定义6.10:
关系模式
R
<
U
,
F
>
⊂
1
N
F
R<U,F> \subset 1NF
R<U,F>⊂1NF,如果对于R的每个非平凡的多值函数依赖
X
→
→
Y
X \rightarrow\rightarrow Y
X→→Y,x都含有码,则称
R
<
U
,
F
>
⊂
4
N
F
R<U,F> \subset 4NF
R<U,F>⊂4NF
如果一个关系模式是4NF,则必为BCNF。