文章目录
1 概述
1.1 关系模式
关系模式 R < U , F > R<U,F> R<U,F>,其含义表示如下:
R:表名
U:列名的集合,如:列A,B,C,D,E,记作: U = { A B C D E } U=\{ABCDE\} U={ABCDE}
F:关系的集合,如:A→B,B→C,D→E,记作: F = { A → B , B → C , D → E } F=\{A→B,B→C,D→E\} F={A→B,B→C,D→E}
1.2 函数依赖的定义
设 R ( U ) R(U) R(U) 是属性集 U U U 上的关系模式, X 、 Y X、Y X、Y 是 U U U 的子集。若对 R ( U ) R(U) R(U) 的任何一个可能关系 r r r, r r r 中不可能存在两个元组在 X X X 上属性值相等,而在 Y Y Y 上的属性值不等,则称 X X X 函数决定 Y Y Y 或 Y Y Y 函数依赖于 X X X,记作: X → Y X → Y X→Y
- 通俗点讲:就是对于同一个 x,只能对应同一个 y,如下图
- 对于关系
A → B
,当 A 取值a1
时,B 可以是b1
和b2
,函数依赖不成立 - 对于关系
A → C
,当 A 取值a1
时,C 只能是c1
,函数依赖成立
- 对于关系
A | B | C |
---|---|---|
a1 | b1 | c1 |
a1 | b2 | c1 |
2 分类
2.1 平凡和非平凡函数依赖
如果
X → Y
,但Y ∈ X
,则称X → Y
是 平凡 的函数依赖
如果X → Y
,但Y ∉ X
,则称X → Y
是 非平凡 的函数依赖。一般情况下总是讨论非平凡的函数依赖
注意:函数依赖X → Y
的定义要求关系模式 R 的 任何可能 的 r 都满足上述条件。
因此不能仅考察关系模式 R 在 某一时刻 的关系 r,就断定某函数依赖成立。
- 通俗点讲
- 平凡函数依赖:自己 能推出 自己。如:
sno → sno,(sno, sname) → sno
- 非平凡函数依赖:自己 能推出 其他。如:
sno → sname
- 平凡函数依赖:自己 能推出 自己。如:
2.2 部分和完全函数依赖
在 R ( U ) R(U) R(U) 中,如果 X → Y X→Y X→Y,并且对于 X X X 的任何一个真子集 X 1 X^1 X1,都有 X 1 X^1 X1 不能决定 Y Y Y,则称 Y Y Y 对 X X X 完全函数依赖,记作: X ⟶ f Y X \stackrel{f}{\longrightarrow} Y X⟶fY。
如果 X → Y X→Y X→Y,但 Y Y Y 不完全函数依赖于 X X X,则称 Y Y Y 对 X X X 部分函数依赖,记作: X ⟶ p Y X \stackrel{p}{\longrightarrow} Y X⟶pY
- 通俗点讲
- 部分函数依赖:X 属性组中的一部分就能决定 Y。如:
(sno, cno) → sname
(【学号 sno】 就能决定 【姓名 sname】,无需 【课程号 cno】) - 完全函数依赖:X 属性组全部在一起才能决定 Y。如:
(sno, cno) → grade
(【学号 sno】 和 【课程号 con】 一起才能决定 【成绩 grade】)
- 部分函数依赖:X 属性组中的一部分就能决定 Y。如:
2.3 传递函数依赖
在 R ( U , F ) R(U,F) R(U,F) 中,如果 X → Y , Y → Z X→Y,Y→Z X→Y,Y→Z 并且 Y ∉ X Y∉X Y∈/X,则 X → Z X→Z X→Z 或称 Z Z Z 对 X X X 传递函数依赖
- 如:
sno → id_card → birthday
(【学号 sno】 能决定 【身份证号 id_card】,id_card 能决定 【出生日期 birthday】,可知sno → birthday
)
3 Armstrong 公理
- Armstrong 公理:又称 函数依赖 的公理系统
- 定义:从已知的一些函数依赖,可以推导出另外一些函数依赖,这就需要一系列推理规则,这些规则常被称作 “Armstrong 公理”
3.1 三条推论
规则 | 推论过程 | 说明 |
---|---|---|
合并规则 | 若 X → Y , Y → Z X→Y,Y→Z X→Y,Y→Z,则 X → Y Z X→YZ X→YZ | 左边相同,合并右边 |
分解规则 | 若 X → Y Z X→YZ X→YZ,则 X → Y , X → Z X→Y,X→Z X→Y,X→Z | 左边相同,分解右边 |
伪传递规则 | 若 X → Y , W Y → Z X→Y,WY→Z X→Y,WY→Z,则 W X → Z WX→Z WX→Z |
3.2 函数闭包
定义:在关系模式 R < U , F > R<U,F> R<U,F> 中为 F F F 所逻辑蕴涵的函数依赖的全体叫作 F F F 的闭包,记作 F + F^+ F+
- 通俗理解
- F + F^+ F+: F F F 中写了的 + + + 没写的
举例说明:
设 U = { A B C D E } , F = { A → B , B → C , D → E } U=\{ABCDE\},F=\{A→B,B→C,D→E\} U={ABCDE},F={A→B,B→C,D→E},则
F F F 中写了的有: A → B , B → C , D → E A→B,B→C,D→E A→B,B→C,D→E
F F F 中没写的有: A → C A→C A→C(根据 传递函数依赖 所得)
所以 F + = { A → B , B → C , D → E , A → C } F^+=\{A→B,B→C,D→E,A→C\} F+={A→B,B→C,D→E,A→C}
3.3 属性闭包
定义:设 F F F 为属性集 U U U 上的一组函数依赖, X 、 Y ∈ U , X F + = { A ∣ X → A 能由 F 根据 A r m s t r o n g 公理导出 } X、Y∈U,X^+_F=\{A|X→A 能由 F 根据 Armstrong 公理导出\} X、Y∈U,XF+={A∣X→A能由F根据Armstrong公理导出},,则 X F + X^+_F XF+ 称为属性集 X X X 关于函数依赖集 F F F 的闭包
- 通俗理解
- X F + X^+_F XF+:属性列 X X X 中写了的 + + + 没写的
举例说明:
设 U = { A B C D E } , F = { A → B , B → C , D → E } U=\{ABCDE\},F=\{A→B,B→C,D→E\} U={ABCDE},F={A→B,B→C,D→E},则
A A A 中写了的有: A → B A→B A→B
A A A 中没写的有: A → C A→C A→C(根据 传递函数依赖 所得)
所以 A F + = { A → B , A → C } A^+_F=\{A→B,A→C\} AF+={A→B,A→C}
3.4 求闭包的算法
求属性集 X ( X ∈ U ) X(X∈U) X(X∈U) 关于 U U U 上的函数依赖集 F F F 的闭包 X F + X^+_F XF+
输入: X , F X,F X,F
输出: X F + X^+_F XF+
步骤:
① X ( 0 ) = X , i = 0 X^{(0)}=X,i=0 X(0)=X,i=0
② X ( i + 1 ) = X ( i ) ∪ B X^{(i+1)}=X^{(i)} ∪ B X(i+1)=X(i)∪B,其中 B B B 表示所有能从 X 0 X^{0} X0 推导出来的属性
③ 判断 X ( i + 1 ) = X ( i ) X^{(i+1)} = X^{(i)} X(i+1)=X(i) ? 或 X ( i ) = U X^{(i)}=U X(i)=U ?
若是,则 X ( i ) X^{(i)} X(i) 就是 X F + X^{+}_F XF+,算法终止.
若否,则 i = i + 1 i=i+1 i=i+1,返回第②步
【例题】已知关系模式
R
<
U
,
F
>
R<U,F>
R<U,F>,其中
U
=
A
,
B
,
C
,
D
,
E
U = {A,B,C,D,E}
U=A,B,C,D,E
F
=
{
A
B
→
C
,
B
→
D
,
C
→
E
,
E
C
→
B
,
A
C
→
B
}
F = \{AB→C,B→D,C→E,EC→B,AC→B\}
F={AB→C,B→D,C→E,EC→B,AC→B}
求
(
A
B
)
F
+
(AB)^+_F
(AB)F+、
(
B
C
)
F
+
(BC)^+_F
(BC)F+
求 ( A B ) F + (AB)^+_F (AB)F+ 步骤:
X 0 = A B X^{0} = AB X0=AB
X 1 X^{1} X1= X 0 ( A B ) ∪ C D = A B C D X^{0}(AB)∪ CD = ABCD X0(AB)∪CD=ABCD
判断 X 1 ≠ X 0 且 X 1 ≠ U X^{1} ≠ X^{0} 且 X^{1} ≠ U X1=X0且X1=U,则 i = i + 1 = 2 i=i+1=2 i=i+1=2,返回上一步,继续执行
X 2 X^{2} X2= X 1 ( A B C D ) ∪ C D E B = A B C D E X^{1}(ABCD)∪ CDEB = ABCDE X1(ABCD)∪CDEB=ABCDE
判断 X 2 ( A B C D E ) = U ( A B C D E ) X^{2}(ABCDE)= U(ABCDE) X2(ABCDE)=U(ABCDE),算法终止
所以: ( A B ) F + = A B C D E (AB)^+_F=ABCDE (AB)F+=ABCDE
同理,求 ( B C ) F + (BC)^+_F (BC)F+ 步骤:
X 0 = B C X^{0} = BC X0=BC
X 1 X^{1} X1= X 0 ( B C ) ∪ D E = B C D E X^{0}(BC)∪ DE = BCDE X0(BC)∪DE=BCDE
X 2 X^{2} X2= X 1 ( B C D E ) ∪ D E = B C D E X^{1}(BCDE)∪ DE = BCDE X1(BCDE)∪DE=BCDE
判断 X 2 = X 1 X^{2} = X^{1} X2=X1,算法终止,
所以 ( B C ) F + = B C D E (BC)^+_F=BCDE (BC)F+=BCDE
3.5 最小函数依赖集
定义:若 F F F 满足下列条件,则称其为一个最小函数依赖集 F m Fm Fm
① F F F 中的任一函数依赖的右部仅有一个属性,即无多余的属性。
② F F F 中不存在 X → A X→A X→A,使得 F F F 与 F − { X → A } F-\{X→A\} F−{X→A} 等价,即无多余的函数依赖。
③ F F F 中不存在 X → A X→A X→A, X X X 有真子集 Z Z Z 使得 F F F 与 ( F − ( X → A ) ) ∪ { Z → A } (F-(X→A)) ∪ \{Z→A\} (F−(X→A))∪{Z→A} 等价,即去掉各函数依赖左边的多余属性。
核心思想:化繁为简,找出属性间最本质的联系
定义有点难理解,直接看求解过程,请严格按顺序执行
第一步:将右侧拆分为单属性。按 分配律
第二步:消除左侧多余属性。对 F F F 中 任一个 X Y → A XY→A XY→A,在 F F F 中求 X + X^+ X+,若 A ∈ X + A ∈X^+ A∈X+,则 Y 为多余的。若存在多余,需及时更新 F
第三步:消除多余函数依赖。对 F F F 中 任一个 X → A X→A X→A,在 F − X → A F-{X→A} F−X→A 中求 X + X^+ X+,若 A ∈ X + A ∈ X^+ A∈X+,则 X → A X→A X→A 为多余的。若存在多余,需及时更新 F
【例题】若 F = { A → B C D , B C → D E , B → D , D → A } F=\{A→BCD,BC→DE,B→D,D→A\} F={A→BCD,BC→DE,B→D,D→A},计算 F m i n Fmin Fmin
第一步:将右侧拆分为单属性
F={A→B
,A→C
,A→D
,BC→D
,BC→E
,B→D,D→A}
第二步:消除左侧多余属性
F={A→B,A→C,A→D,BC→D,BC→E,B→D,D→A}
(1) 对于 BC→D,判断 B 属性是否多余
C F + = C , D ∉ C F + C^+_F=C,D ∉ C^+_F CF+=C,D∈/CF+,所以 B 不是多余
继续判断 C 属性是否多余
B F + = B D A C E , D ∈ C F + B^+_F=BDACE,D ∈ C^+_F BF+=BDACE,D∈CF+,所以 C 是多余。得到 B→D,此时
F={A→B,A→C,A→D,B→D,BC→E,B→D,D→ A},其中 B→D 重复,去重后得到
F={A→B,A→C,A→D,BC→E,B→D,D→ A}
(2) 对于 BC→E,判断 B 属性是否多余
C F + = C , E ∉ C F + C^+_F=C,E ∉ C^+_F CF+=C,E∈/CF+,所以 B 不是多余
继续判断 C 属性是否多余
B F + = B D A C E , E ∈ C F + B^+_F=BDACE,E ∈ C^+_F BF+=BDACE,E∈CF+,所以 C 是多余。得到 B→E,此时
F={A→B,A→C,A→D,B→E,B→D,D→ A}
第三步:消除多余依赖
F={A→B,A→C,A→D,B→E,B→D,D→ A}
(1) A→B,令 G={A→C,A→D,B→E,B→D,D→A},则 A G + = A C D , B ∉ A G + A^+_G=ACD,B ∉ A^+_G AG+=ACD,B∈/AG+,所以 A→B 不多余
(2) A→C,令 G={A→B,A→D,B→E,B→D,D→A},则 A G + = A B D E , C ∉ A G + A^+_G=ABDE,C ∉ A^+_G AG+=ABDE,C∈/AG+,所以 A→C 不多余
(3) A→D,令 G={A→B,A→C,B→E,B→D,D→ A},则 A G + = A B C E D , D ∈ A G + A^+_G=ABCED,D ∈ A^+_G AG+=ABCED,D∈AG+,所以 A→C 多余,及时更新 F:F={A→B,A→C,B→E,B→D,D→A}
(4) B→E,令 G={A→B,A→C,B→D,D→A},则 B G + = B D A C , E ∉ B G + B^+_G=BDAC,E ∉ B^+_G BG+=BDAC,E∈/BG+,所以 B→E 不多余
(5) B→D,令 G={A→B,A→C,B→E,D→A},则 B G + = B E , D ∉ B G + B^+_G=BE,D ∉ B^+_G BG+=BE,D∈/BG+,所以 B→D 不多余
(6) D→A,令 G={A→B,A→C,B→E,B→D},则 D G + = D , A ∉ D G + D^+_G=D,A ∉ D^+_G DG+=D,A∈/DG+,所以 A→C 不多余
所以 F m i n = { A → B , A → C , B → E , B → D , D → A } Fmin=\{A→B,A→C,B→E,B→D,D→A\} Fmin={A→B,A→C,B→E,B→D,D→A}