闭包计算(视频点击)
例1:设有函数依赖集F={AB->CE,A->C,GP->B,EP->A,CDE->P,HB->P,D->HG,ABC->H},求属性D关于F的闭包D+?
解:设X={D},X0={D,H,G},X1={D,H,G};X0=X1所以属性D关于F的闭包D+为X=D,H,G
例2:设有函数依赖集F={AC->PE,PG->A,B->CE,A->P,GA->B,GC->A,PAB->G,AE->GB,ABCP->H},求属性BG关于F的闭包BG+?
解:设X={B,G},X0={B,C,E,G},X1={B,C,E,G};X0=X1所以属性D关于F的闭包D为X=B,C,E,G
例3:已知关系模式R{A,B,C,D,E}和函数依赖集F={AB->C,B->D,C->E,EC->B,AC->B,D->BE},求属性集AC关于函数依赖集的F的闭包
解:设X={A,C},X0={A,C,E,B},X1={A,B,C,D,E};X1=R所以属性AC关于F的闭包AC+为X=A,B,C,D,E
确定最小函数依赖集(视频点击)
定义
最小函数依赖集需满足三个条件:
-
F中任一函数依赖的右部仅包含一个属性
-
F中不存在这样的函数依赖
X->A
,使得F与F-{X->A}
与F等价 -
F中不存在这样的函数依赖
X->A
,X有真子集Z使得F-{X->A}U{Z->A}
与F等价
做法
-
右切(右部最小化)
-
除本求包(除去本身,求闭包)(规则最小化)
-
左部最小化
例:已知关系模式R<U,F>,U={A,B,C,D,E,F,G},F={BCD->A,BC->E,A->F,F->G,C->D,A->G},求F的最小函数依赖集?
解:1.对F进行右部最小化:右部仅含有一个属性,全体满足
2.对F进行规则最小化,闭包:(BCD)=BCDE,(BC)=BCDAFG,(A)=AG,(F)=F,(C)=C,(A)=AFG(与A->G重复),去除A->G
3.对F进行左部最小化,BCD->A,有C->D,可用BC->A替换;BC->E,不可替代
所以最小函数依赖集{BC->A,BC->E,A->F,F->G,C->D}
过程模板
1.对F进行右部最小化
2.对F进行规则最小化
3.对F进行左部最小化
数据库无损分解和保持函数依赖
在关系范式中分解关系基本原则
-
实现无损连接
-
保持原有依赖关系
判断是否具有无损连接性
例:U={A,B,C,D,E},F={AB->C,C->D,D->E},R1={A,B,C},R2={D,E}
解:
判断是否保持函数依赖
-
先求F的最小函数依赖集F’
-
再求分解的R的函数依赖的并集(U)
-
进行判断
e.g:F={E->D,C->B,CE->G,B->A},F={R1(A,B),R2(B,C),R3(E,D),R4(E,A,G)}
解:1.F'={E->D,C->B,CE->G,B->A}
2.R1(A,B),F1={B->A}
R2(B,C),F2={C->B}
R3(E,D),F3={E->D}
R4(E,A,G),F4={EAG->EAG}
3.G={B->A,C->B,E->D,EAG->EAG},G与F'相比,无CE->G
F'!=(F1 u F2 u F3 u F4),所以不保持函数依赖
注意:当且仅当G=F’时,也就是F’中的依赖要在G中全部找到
确认候选码(视频点击)
算法描述
候选键的定义:
若关系中的某一属性组的值能唯一地标识一个元组,则称该属性组为候选键。
若w是候选键,则必须满足两个条件:
-
W的闭包是U;
-
W没有冗余。
设关系模式R中U=ABC… …等N个属性,U中的属性在F中有四种范围:
-
左右出现;
-
只在左部出现;
-
只在右部出现;
-
不在左右出现;
算法:按以下步骤求候选键:
-
只在F右部出现的属性,不属于候选码;
-
只在F左部出现的属性,一定存在于某候选码当中;
-
两边都没有出现的节点,一点存在于候选键中。
-
其他属性逐个与2,3的属性组合,求属性闭包,直至X的闭包等于U,若等于U,则X为候选码。
//关系的候选码的含义:若关系中的某一属性组的值可以唯一的标识元组,而其子集不能,则称该属性组为候选码
(候选码中的属性称为主属性)
例1:R{A,B,C,D},F{AB->C,AB->E,CDE->AB},求候选码?
LR:A,B,C,E
L:D
R:null
NULL:null
//开始进行其他属性与L并(未出现)组合闭包排查
L并(未出现)={D},{A,B,C,E}
{
{AD}={AD},{BD}={BD},{CD}={CD},{ED}={ED}
{ABD}={ABDEC},{ACD}={ACD},{AED}={AED},{BCD}={BCD},{BED}={BED},{CED}={ABCDE}//有满足时就停止计算
候选码为:{ABD}、{CDE}
}
例2:R<U,F>,U=(A,B,C,D,E,G),F={AB->C,CD->E,E->A,A->G},求候选码?
L:B,D
R:G
LR:A,C,E
NULL:NULL
//开始进行其他属性与L并(未出现)组合闭包排查
L并(未出现)={B,D},{A,C,E}
{
{A,B,D}={A,B,C,D,E,G},{C,B,D}={A,B,C,D,E},{E,B,D}={A,B,C,D,E}//有满足时就停止计算
候选码为:{A,B,D}、{B,C,D}、{B,D,E}
}
关系模式范式的判断和范式的分解(视频点击)
1NF(最基本的范式)
e.g. 关系模式R(A,B,C,D),函数依赖F={AB->D,A->C}
1.候选码:A,B
2.是否是2NF?为什么?
不是2NF,因为存在A->C,即存在非主属性对码的部分函数依赖
3.如何分解变成2NF?
R1(A,B,D)、R2(A,C)
2NF(消除非主属性对码的部分函数依赖)
e.g. R(A,B,C,D),F{A->BC,B->D}
1.候选码:A
2.是否是3NF,为什么?
不是3NF,因为存在A->B,B->D,得A->D,存在非主属性对码的传递函数依赖
3.如何分解为3NF
R1(A,B,C)、R2(B,D)
3NF(消除非主属性对码的传递函数依赖)
e.g. R(A,B,C),F{AB->C,BC->A,C->B}
1.候选码:AB or C
2.此题是否是BCNF,为什么?(该题有错误)
不是BCNF,因为C是决定性因素,但是C不包含码
3.若一个题是BCNF,为什么?
不存在任何属性对码的传递函数依赖和部分函数依赖
BCNF(消除主属性对码的部分和传递函数依赖)
e.g. R(A,B,C),F:{A->B,A->C}
不为4NF,分解成R1(A,B),R2(A,C)
4NF(消除非平凡且非函数依赖的多值依赖)
多值依赖:一个主码可以决定一组值
5NF(消除连接依赖)
一个表可以分成三个表二又可以通过自然连接,合到一起
例:
例1:
R(商店编号,商品编号,数量,部门编号,负责人)
如果规定:(1)每个商店的每种商品只能在一个部门销售
(2)每个商店的每个部门只有一个负责人
(3)每个商店的每种商品只有一个库存数量
试回答下列问题:
(1)根据上述规定,写出关系模式R的基本函数依赖
(2)找出关系模式R的候选码
(3)试问关系模式R最高达到了第几范式?为什么?
(4)如果R不属于3NF,请将R分解成3NF模式集?
答案:
(1)有三个函数依赖:(商店编号,商品编号)->部门编号,(商店编号,部门编号)->负责人,(商店编号,商品编号)->数量
(2)候选码:(商店编号,商品编号)
(3)最高达到2NF,因为存在着非主属性"负责人"对候选码(商店编号,商品编号)的传递函数依赖,所以R属于2NF,R不属于3NF
(4)R1(商店编号,商品编号,部门编号,数量),R2(商店编号,商品编号,负责人)
例2:
设有关系模式R(A,B,C,D,E),R中的属性均不可再分解,若基于函数依赖进行讨论,试根据给定的函数依赖集F,分析R最高属于第几
范式,并说明原因?
(1)F={AB->C,AB->E,CDE->AB}
答:R最高属于3NF,因为候选码为CDE,ABD;因为AB是决定性因素,不包含码,所以他不满足BCNF
(2)F={CD->A,CD->B,AB->E}
答:R最高属于2NF,因为候选码为CD,即主属性为C,D且存在非主属性对码的传递函数依赖(CD->AB->E)
保持无损连接性的BCNF分解算法(视频1&视频2)
INPUT:关系模式R以及R上成立的函数依赖集F
-
1.关系模式R以及在R上成立的函数依赖集F1.初始化P={R}
-
2.若P中的所有关系模式S都是BCNF,则转步骤4
-
3.若P中有一个模式S不是BCNF,则S中必能找到一个函数依赖X->A,X不是S的候选码,且A不属于x。设S1=XA,S2 = S-A,分解后的{S1,S2}替代S,转步骤2
-
4.算法结束,输出P
例:R={A,B,C,D,E,F,G},F={A->B,A->C,C->D,C->E,E->FG},将R分解成BCNF
R={A,B,C,D,E,F,G},F={A->B,A->C,C->D,C->E,E->FG}
1.P={A,B,C,D,E,F,G},Fp={A->B,A->C,C->D,C->E,E->FG}
2.先判断满足BC范式的函数依赖,(BC范式:看下函数依赖的左侧是否都为候选码)
左:A
右:B,D,F,G
左右:C,E
未出现:null
左 “并” 未出现={A},A是唯一候选码
此时指针从F的左边依次进行判断(是否是BC范式)
指针到:C->D,不满足BC范式,开始进行S1=XA,S2=S-A
S1={C,D},S2=S-A={A,B,C,E,F,G},F2={A->B,A->C,C->E,E->FG,C->FG} (注意这里要将传递函数依赖也写出来)
......依次递归即可