关系数据库设计基础理论:函数依赖、Armstrong公理、最小函数依赖集

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={ABBCDE}

1.2 函数依赖的定义

R ( U ) R(U) R(U) 是属性集 U U U 上的关系模式, X 、 Y X、Y XY 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 XY

  • 通俗点讲:就是对于同一个 x,只能对应同一个 y,如下图
    • 对于关系 A → B,当 A 取值 a1 时,B 可以是 b1b2,函数依赖不成立
    • 对于关系 A → C,当 A 取值 a1 时,C 只能是 c1,函数依赖成立
ABC
a1b1c1
a1b2c1

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 XY,并且对于 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 XfY
如果 X → Y X→Y XY,但 Y Y Y 不完全函数依赖于 X X X,则称 Y Y Y X X X 部分函数依赖,记作: X ⟶ p Y X \stackrel{p}{\longrightarrow} Y XpY

  • 通俗点讲
    • 部分函数依赖:X 属性组中的一部分就能决定 Y。如:(sno, cno) → sname(【学号 sno】 就能决定 【姓名 sname】,无需 【课程号 cno】)
    • 完全函数依赖:X 属性组全部在一起才能决定 Y。如:(sno, cno) → grade(【学号 sno】 和 【课程号 con】 一起才能决定 【成绩 grade】)

2.3 传递函数依赖

R ( U , F ) R(U,F) R(U,F) 中,如果 X → Y , Y → Z X→Y,Y→Z XYYZ 并且 Y ∉ X Y∉X Y/X,则 X → Z X→Z XZ 或称 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 XYYZ,则 X → Y Z X→YZ XYZ左边相同,合并右边
分解规则 X → Y Z X→YZ XYZ,则 X → Y , X → Z X→Y,X→Z XYXZ左边相同,分解右边
伪传递规则 X → Y , W Y → Z X→Y,WY→Z XYWYZ,则 W X → Z WX→Z WXZ

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={ABBCDE},则
F F F 中写了的有: A → B , B → C , D → E A→B,B→C,D→E ABBCDE
F F F 中没写的有: A → C A→C AC(根据 传递函数依赖 所得)
所以 F + = { A → B , B → C , D → E , A → C } F^+=\{A→B,B→C,D→E,A→C\} F+={ABBCDEAC}

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 公理导出\} XYUXF+={AXA能由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={ABBCDE},则
A A A 中写了的有: A → B A→B AB
A A A 中没写的有: A → C A→C AC(根据 传递函数依赖 所得)
所以 A F + = { A → B , A → C } A^+_F=\{A→B,A→C\} AF+={ABAC}

3.4 求闭包的算法

求属性集 X ( X ∈ U ) X(X∈U) XXU 关于 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)=Xi=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={ABCBDCEECBACB}
( 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 X0ABCD=ABCD
判断 X 1 ≠ X 0 且 X 1 ≠ U X^{1} ≠ X^{0} 且 X^{1} ≠ U X1=X0X1=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 X1ABCDCDEB=ABCDE
判断 X 2 ( A B C D E ) = U ( A B C D E ) X^{2}(ABCDE)= U(ABCDE) X2ABCDE=UABCDE,算法终止
所以: ( 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 X0BCDE=BCDE
X 2 X^{2} X2= X 1 ( B C D E ) ∪ D E = B C D E X^{1}(BCDE)∪ DE = BCDE X1BCDEDE=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 XA,使得 F F F F − { X → A } F-\{X→A\} F{XA} 等价,即无多余的函数依赖。
F F F 中不存在 X → A X→A XA X X X 有真子集 Z Z Z 使得 F F F ( F − ( X → A ) ) ∪ { Z → A } (F-(X→A)) ∪ \{Z→A\} (F(XA)){ZA} 等价,即去掉各函数依赖左边的多余属性。
 
核心思想:化繁为简,找出属性间最本质的联系
定义有点难理解,直接看求解过程,请严格按顺序执行
第一步:将右侧拆分为单属性。按 分配律
第二步:消除左侧多余属性。对 F F F任一个 X Y → A XY→A XYA,在 F F F 中求 X + X^+ X+,若 A ∈ X + A ∈X^+ AX+,则 Y 为多余的。若存在多余,需及时更新 F
第三步:消除多余函数依赖。对 F F F任一个 X → A X→A XA,在 F − X → A F-{X→A} FXA 中求 X + X^+ X+,若 A ∈ X + A ∈ X^+ AX+,则 X → A X→A XA 为多余的。若存在多余,需及时更新 F

【例题】若 F = { A → B C D , B C → D E , B → D , D → A } F=\{A→BCD,BC→DE,B→D,D→A\} F={ABCDBCDEBDDA},计算 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+=CD/CF+,所以 B 不是多余
      继续判断 C 属性是否多余
      B F + = B D A C E , D ∈ C F + B^+_F=BDACE,D ∈ C^+_F BF+=BDACEDCF+,所以 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+=CE/CF+,所以 B 不是多余
      继续判断 C 属性是否多余
      B F + = B D A C E , E ∈ C F + B^+_F=BDACE,E ∈ C^+_F BF+=BDACEECF+,所以 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+=ACDB/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+=ABDEC/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+=ABCEDDAG+,所以 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+=BDACE/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+=BED/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+=DA/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={ABACBEBDDA}

  • 20
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鱼丸丶粗面

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值