数据库规范化理论大题考点

数据库规范化理论大题考点

1.Closure of Attributes 属性集的闭包相关题型

1.1 属性集闭包的算法

result:= α;
	repeat
		for each 函数依赖β→r in F do
			begin
				if β 蕴涵于 result then result := result ∪ r;
			end
       	until (result 不变)

对函数依赖集F下的每一个函数依赖,如果依赖的左边 β \beta β在结果属性集中,那么依赖的右边 γ \gamma γ加入到结果集中。重复直至result不变

  • 例1:计算属性闭包

$Example :Given\ R<U,F>, R = {A,B,C,D},F={B\rightarrow CD,AD\rightarrow E,B\rightarrow A}\$

( B C ) + ? (BC)^+? (BC)+?

解:
1. R e s u l t = { B C } 2. R e s u l t = { A B C D } 3. R e s u l t = { A B C D E } 1.Result = \{BC\}\\ 2.Result = \{ABCD\}\\ 3.Result = \{ABCDE\} 1.Result={BC}2.Result={ABCD}3.Result={ABCDE}

  • 例2:判断函数依赖是否成立

定理: X → Y ⇔ Y ⊆ ( X F ) + X\rightarrow Y\Leftrightarrow Y\subseteq (X_F)^+ XYY(XF)+

image-20220301215622373

( A B ) F + = { A , B , C , D , E } (AB)_F^+ = \{A,B,C,D,E\} (AB)F+={A,B,C,D,E} A B → E AB\rightarrow E ABE成立

1.2 最小依赖的计算

算法:

  • 函数依赖的右部分解成单属性的函数依赖
  • 去掉函数依赖的左部的冗余属性
  • 去掉冗余的函数依赖

例子

  • 例1

    image-20220304201626944

    • 分解

    F = { A → B , A → C , B → C , A B → C } F = \{A\rightarrow B,A\rightarrow C,B\rightarrow C,AB\rightarrow C\} F={AB,AC,BC,ABC}

    • 去掉左部冗余属性

      考察 A B → C AB\rightarrow C ABC中B是否冗余。即考虑函数依赖集F是否逻辑蕴含函数依赖集 F 1 = { A → B , A → C , B → C , A → C } F_1 = \{A\rightarrow B,A\rightarrow C,B\rightarrow C,A\rightarrow C\} F1={AB,AC,BC,AC}

      计算 A F + = { B C } ⊇ C A_F^+ = \{BC\}\supe {C} AF+={BC}C,所以B冗余,去除

      得到 F 1 = { A → B , A → C , B → C } F_1 = \{A\rightarrow B,A\rightarrow C,B\rightarrow C\} F1={AB,AC,BC}

    • 去除冗余的函数依赖

      计算属性闭包 A F 1 − ( A → C ) + = A B C ⊇ C A^+_{F_1-(A\rightarrow C)} = {ABC}\supe {C} AF1(AC)+=ABCC,所以函数依赖 A → C A\rightarrow C AC多余,得到 F 2 = { A → B , B → C } F_2 = \{A\rightarrow B,B\rightarrow C\} F2={AB,BC}

1.3 正则覆盖的计算

正则覆盖可以由最小覆盖合并得到。

image-20220304203938847

step1:分解右部
F = { A → B , A → C , B C D → E , B → D , A → D , E → A } F = \{A\rightarrow B,A\rightarrow C,BCD\rightarrow E,B\rightarrow D,A\rightarrow D,E\rightarrow A\} F={AB,AC,BCDE,BD,AD,EA}
step2:去除左部的冗余属性

  • 考察 B C D → E BCD\rightarrow E BCDE中B是否冗余,即考察函数依赖集F是否逻辑蕴含函数依赖集 F 1 = { A → B , A → C , C D → E , B → D , A → D , E → A } F_1 = \{A\rightarrow B,A\rightarrow C,CD\rightarrow E,B\rightarrow D,A\rightarrow D,E\rightarrow A\} F1={AB,AC,CDE,BD,AD,EA},计算 ( C D ) F + = { } (CD)_F^+ = \{\} (CD)F+={},所以B不冗余。
  • 考察 B C D → E BCD\rightarrow E BCDE中C是否冗余,即考察函数依赖集F是否逻辑蕴含函数依赖集 F 2 = { A → B , A → C , B D → E , B → D , A → D , E → A } F_2 = \{A\rightarrow B,A\rightarrow C,BD\rightarrow E,B\rightarrow D,A\rightarrow D,E\rightarrow A\} F2={AB,AC,BDE,BD,AD,EA},计算 ( B D ) F + = { } (BD)_F^+ = \{\} (BD)F+={},所以C不冗余。
  • 考察 B C D → E BCD\rightarrow E BCDE中D是否冗余,即考察函数依赖集F是否逻辑蕴含函数依赖集 F 3 = { A → B , A → C , B C → E , B → D , A → D , E → A } F_3 = \{A\rightarrow B,A\rightarrow C,BC\rightarrow E,B\rightarrow D,A\rightarrow D,E\rightarrow A\} F3={AB,AC,BCE,BD,AD,EA},计算 ( B C ) F + = { A B C D E } ⊇ E (BC)_F^+ = \{ABCDE\}\supe {E} (BC)F+={ABCDE}E,所以D冗余。

去除冗余属性得 F 3 = { A → B , A → C , B C → E , B → D , A → D , E → A } F_3 = \{A\rightarrow B,A\rightarrow C,BC\rightarrow E,B\rightarrow D,A\rightarrow D,E\rightarrow A\} F3={AB,AC,BCE,BD,AD,EA}

step3:去除多余的函数依赖

对于函数依赖 A → D A\rightarrow D AD,计算 ( A ) F 3 − ( A → D ) + = { A B C D E } ⊇ D (A)^+_{F_3-(A\rightarrow D)} = \{ABCDE\}\supe {D} (A)F3(AD)+={ABCDE}D,所以函数依赖多余,去除得 F 4 = { A → B , A → C , B C → E , B → D , E → A } F_4 = \{A\rightarrow B,A\rightarrow C,BC\rightarrow E,B\rightarrow D,E\rightarrow A\} F4={AB,AC,BCE,BD,EA}

step4:合并

F c a n o n c a l = { A → B C , B C → E , B → D , E → A } F_{canoncal} = \{A\rightarrow BC,BC\rightarrow E,B\rightarrow D,E\rightarrow A\} Fcanoncal={ABC,BCE,BD,EA}

2. 候选码的计算

算法:

image-20220304215615647

例题

例1:

image-20220304215644230

step1:X = {A}

step2: A F + = A A_F^+ = A AF+=A,所以单独的A不是候选码

step3: ( A B ) F + = U (AB)_F^+ = U (AB)F+=U,所以AB是候选码

( A C ) F + = U (AC)_F^+ = U (AC)F+=U,所以AC是候选码

( A E ) F + = U (AE)_F^+=U (AE)F+=U,所以AE是候选码

​ Y为空集

结束,所有的候选码为AB,AC,AE

2.1 候选码计算的应用

2.1.1 2NF的判断

2NF要求不存在非主属性对码的部分依赖,所以需要找出所有的候选码,确认非主属性,和是否有其对码的部分依赖的情况。


Example:R(A, B,C,D), F = {AB → C, AC → BD}

step1:求出所有的候选码

候选码集合为{AB, AC}

step2:非主属性,得到非主属性为D

step3:构造完整依赖: A B → D AB\rightarrow D ABD A C → D AC\rightarrow D ACD,判断这两个函数依赖中有无冗余属性。若无则不存在部分依赖,否则存在。

计算 ( A ) F + = ∅ (A)_F^+ = ∅ (A)F+= ( B ) F + = ∅ (B)_F^+ = ∅ (B)F+= ( C ) F + = ∅ (C)_F^+ = ∅ (C)F+=,即无冗余属性,所以不存在部分依赖,满足2NF

2.1.2 3NF的判断

3NF的计算也是需要计算出所有的候选码的。进而判断 β − α \beta-\alpha βα的属性是不是在候选码中。


Example:R(A, B, C, D), F = {AB → C, C → D},判断是否属于第三范式。

step1:候选码计算

( A B ) F + = U (AB)_F^+ = U (AB)F+=U,所以AB即是候选码。

step2:对于函数依赖 C → D C\rightarrow D CD,对应 C : α , D : β C:\alpha,D:\beta CαDβ,那么 β − α = D \beta-\alpha = D βα=D不属于候选码

所以该范式非第三范式

3.Decomposition

3.1 无损分解和依赖保持的判定

Examples: R = ( A, B, C ) F = { A → B, B → C }

Decomposition1: R1 = (A, B), R2 = (B, C)

➢ IS Lossless-join ?
R 1 ∩ R 2 = B B → R 2 成 立 , 所 以 该 分 解 为 L o s s l e s s − J o i n   D e c o m p o s i t i o n R_1\cap R_2 = B\\ B\rightarrow R_2成立,所以该分解为Lossless-Join\ Decomposition R1R2=BBR2LosslessJoin Decomposition
➢ IS Dependency preserving?
F 1 = { A → B } F 2 = { B → C } ( F 1 ∪ F 2 ) + = F + , 所 以 该 分 解 是 依 赖 保 持 的 F_1 = \{A\rightarrow B\}\\ F_2 = \{B\rightarrow C\}\\ (F_1\cup F_2)^+=F^+,所以该分解是依赖保持的 F1={AB}F2={BC}(F1F2)+=F+,


Decomposition2: R1 = (A, B), R2 = (A, C)

➢ IS Lossless-join ?
R 1 ∩ R 2 = A A → R 1 成 立 , 所 以 该 分 解 为 L o s s l e s s − J o i n   D e c o m p o s i t i o n R_1\cap R_2 = A\\ A\rightarrow R_1成立,所以该分解为Lossless-Join\ Decomposition R1R2=AAR1LosslessJoin Decomposition
➢ IS Dependency preserving?
F 1 = { A → B } F 2 = { A → C } ( F 1 ∪ F 2 ) + ≠ F + , 所 以 该 分 解 不 是 依 赖 保 持 的 F_1 = \{A\rightarrow B\}\\ F_2 = \{A\rightarrow C\}\\ (F_1\cup F_2)^+≠F^+,所以该分解不是依赖保持的 F1={AB}F2={AC}(F1F2)+=F+,

3.2 BCNF的无损分解

Examples:

emp_info ( emp_id, emp_name, epm_phone, dept_name, dept_phone, dept_mgrname, skill_id, skill_name, skill_date, skill_lvl )

Fc = { emp_id → (emp_name, epm_phone, dept_name ), dept_name → ( dept_phone, dept_mgrname) , skill_id → skill_name, (emp_id, skill_id , skill_date )→ skill_lvl }

CK: (emp_id, skill_id , skill_date )

要求:Decomposition to BCNF


step1:emp_id不是码,将emp_id决定的最大的关系模式取出,得到:

R1 = {emp_id, emp_name, epm_phone, dept_name, dept_phone, dept_mgrname}

有函数依赖:

F1 : {emp_id → emp_name, epm_phone, dept_name; dept_name → dept_phone, dept_mgrname}

在原关系模式中去除右半部分,得到:

R2 = {emp_id, skill_id, skill_name, skill_date, skill_lvl}

有函数依赖:

F2 = {skill_id → skill_name, (emp_id, skill_id , skill_date)→ skill_lvl}


step 2 :在R1中仍有dept_name不是超码,继续分解R1

R11 = {dept_name, dept_phone, dept_mgrname}

有函数依赖:

F11 : {dept_name → dept_phone, dept_mgrname}

满足BCNF范式

R12 = {emp_id, emp_name, epm_phone, dept_name}

有函数依赖:

F12 = {emp_id → emp_name, epm_phone, dept_name}

满足BCNF范式


step3:在R2中仍有skill_id不是超码,继续分解:

R12 = {skill_id, skill_name}

有函数依赖:

F21 = {skill_id → skill_name}

满足BCNF范式

R22 = {skill_id, skill_date, emp_id, skill_lvl}

有函数依赖:

F22 = {(emp_id, skill_id , skill_date)→ skill_lvl}

满足BCNF范式


至此所有的子模式均满足BCNF范式,分解完毕,结果为R11,R12,R21,R22

{skill_id, skill_name}`

有函数依赖:

F21 = {skill_id → skill_name}

满足BCNF范式

R22 = {skill_id, skill_date, emp_id, skill_lvl}

有函数依赖:

F22 = {(emp_id, skill_id , skill_date)→ skill_lvl}

满足BCNF范式


至此所有的子模式均满足BCNF范式,分解完毕,结果为R11,R12,R21,R22

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Blanche117

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

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

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

打赏作者

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

抵扣说明:

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

余额充值