码和属性的关系
函数依赖
f
(
X
)
→
Y
f(X)\rightarrow Y
f(X)→Y,则
Y
Y
Y函数依赖于
X
X
X。理解为知道
X
X
X后,就可以推出
Y
Y
Y;而且,能且仅能推出唯一的
Y
Y
Y。这类似于数学上的函数。
平凡函数依赖:
X
→
Y
X \rightarrow Y
X→Y,同时
Y
∈
X
Y \in X
Y∈X,则是平凡函数依赖。
非平凡函数依赖:
X
→
F
Y
X \xrightarrow{F} Y
XFY,同时
Y
∉
X
Y \notin X
Y∈/X,则是非平凡函数依赖。
完全函数依赖:
X
→
Y
X \rightarrow Y
X→Y,而且任何
X
X
X的真子集
X
′
X^{'}
X′,都没有
X
′
→
Y
X^{'}\rightarrow Y
X′→Y
部分函数依赖:
X
→
P
Y
X \xrightarrow{P} Y
XPY,而且任何
X
X
X的真子集
X
′
X^{'}
X′,存在至少一个
X
′
X^{'}
X′,
X
′
→
P
Y
X^{'}\xrightarrow{P} Y
X′PY。
码
一个关系的所有属性。
候选码: 唯一标识一个关系的属性组
主码: 候选码多于一个,从候选码中选出的一个码作为主码。
主属性: 候选码的所有属性。
非主属性: 不包含在任何候选码中的属性
全码: 极端情况下,整个属性组都是码。
外码:
X
X
X不是该关系模式的码,但是
X
X
X是另一个关系模式的码。比如
(
S
n
o
,
C
n
o
,
G
r
a
d
e
)
(Sno, Cno, Grade)
(Sno,Cno,Grade)中的Sno不是码,但
S
n
o
Sno
Sno是
(
S
n
o
,
S
n
a
m
e
,
S
a
g
e
)
(Sno, Sname, Sage)
(Sno,Sname,Sage)的码,则
S
n
o
Sno
Sno是外码
范式
范式的作用是减少数据冗余和消除各种异常。
1NF
所有的关系模式都是1NF
2NF
在1NF的基础上,不存在部分函数依赖。
比如给出一个表:
(
S
n
o
,
S
d
e
p
t
,
S
l
o
c
,
C
n
o
,
G
r
a
d
e
)
(Sno,Sdept,Sloc,Cno,Grade)
(Sno,Sdept,Sloc,Cno,Grade)
其中
S
n
o
Sno
Sno学号,
S
d
e
p
t
Sdept
Sdept是系,
S
l
o
c
Sloc
Sloc是寝室地址,
C
n
o
Cno
Cno是课程号,
G
r
a
d
e
Grade
Grade是该学生某个课程的成绩。
(
S
n
o
,
C
n
o
)
→
F
G
r
a
d
e
S
n
o
→
S
d
e
p
t
,
(
S
n
o
,
C
n
o
)
→
P
S
d
e
p
t
S
n
o
→
S
l
o
c
,
(
S
n
o
,
C
n
o
)
→
P
S
l
o
c
(Sno, Cno)\xrightarrow{F} Grade \\ Sno \rightarrow Sdept, \ (Sno,Cno)\xrightarrow{P} Sdept\\ Sno \rightarrow Sloc, \ (Sno, Cno)\xrightarrow{P} Sloc
(Sno,Cno)FGradeSno→Sdept, (Sno,Cno)PSdeptSno→Sloc, (Sno,Cno)PSloc
那么上述存在了部分函数依赖,需要把部分函数依赖的进行消除:
S
n
o
→
S
d
e
p
t
S
n
o
→
S
l
o
c
Sno \rightarrow Sdept \\ Sno \rightarrow Sloc
Sno→SdeptSno→Sloc
因此得出新的关系模式:
(
S
n
o
,
S
l
o
c
,
S
d
e
p
t
)
(
S
n
o
,
C
n
o
,
G
r
a
d
e
)
(Sno, Sloc, Sdept) \\ (Sno, Cno, Grade)
(Sno,Sloc,Sdept)(Sno,Cno,Grade)
3NF
在2NF的基础上,消除传递函数依赖。
传递函数依赖: X → Y X\rightarrow Y X→Y, Y ↛ X Y\nrightarrow X Y↛X, Y → Z Y\rightarrow Z Y→Z,则 Z Z Z传递依赖于 X X X。
比如上述的关系模式:
(
S
n
o
,
S
l
o
c
,
S
d
e
p
t
)
(Sno, Sloc, Sdept)
(Sno,Sloc,Sdept)
有
S
n
o
→
S
l
o
c
S
d
e
p
t
↛
S
n
o
S
l
o
c
→
S
d
e
p
t
Sno\rightarrow Sloc \\ Sdept \nrightarrow Sno \\ Sloc \rightarrow Sdept
Sno→SlocSdept↛SnoSloc→Sdept
那么
S
d
e
p
t
Sdept
Sdept函数传递依赖与
S
n
o
Sno
Sno。3NF需要消除这种模式。
(
S
n
o
,
S
d
e
p
t
)
(
S
d
e
p
t
,
S
l
o
c
)
(Sno, Sdept) \\ (Sdept, Sloc)
(Sno,Sdept)(Sdept,Sloc)
BCNF
在3NF基础上,使得每一个决定因素都包含码。
给出一个BCNF的反例:
S
T
J
(
S
,
T
,
J
)
STJ(S, T, J)
STJ(S,T,J)
其中
S
S
S是学生,
T
T
T是教师,
J
J
J是课程。所以有:
(
S
,
J
)
→
T
(
S
,
T
)
→
J
T
→
J
(S, J)\rightarrow T \\ (S, T)\rightarrow J \\ T\rightarrow J
(S,J)→T(S,T)→JT→J
(
S
,
J
)
(S, J)
(S,J)和
(
S
,
T
)
(S, T)
(S,T)都是候选码。
T
T
T是决定因素,但是
T
T
T不包含码。
在只考虑函数依赖的情况下,BCNF是规范化程度最高的范式。
4NF
多值依赖: 设 R ( U ) R(U) R(U)是属性集 U U U上的一个关系模式, X , Y , Z X,Y,Z X,Y,Z是 U U U的子集,且 Z = U − X − Y Z=U-X-Y Z=U−X−Y。当且仅当 R ( U ) R(U) R(U)的任一关系 r r r,给定的一对 ( x , y ) (x,y) (x,y)值,有一组 Y Y Y的值,这组值仅仅取决于 X X X的值而与 Z Z Z的值无关,则成 R ( U ) R(U) R(U)中的多值依赖 X → → Y X\rightarrow \rightarrow Y X→→Y成立。
平凡多值依赖: 若 X → → Y X \rightarrow \rightarrow Y X→→Y,而 Z = ∅ Z=\empty Z=∅,则称 X → → Y X\rightarrow \rightarrow Y X→→Y为平凡多值依赖。
4NF: 关系模式 R < U , F > ∈ 1 N F R<U,F>\in 1NF R<U,F>∈1NF,如果对于 R R R的每个非平凡多值依赖 X → → Y X\rightarrow \rightarrow Y X→→Y( Y ⊈ X Y \nsubseteq X Y⊈X),X都含有码,则 R < U , F > ∈ 4 N F R<U,F>\in 4NF R<U,F>∈4NF。