数据库复习 BCNF分解算法

算法描述

输入:关系R0和其上的函数依赖集S0
输出:由R0分解出的关系集合,其中每个关系均属于BCNF
方法:下列步骤可以被递归地用于任意关系R和FD集合S。初始时,R=R0,S=S0

  1. 检验R是否属于BCNF。如果是,不需要做任何事,返回{R}作为结果。
  2. 如果存在BCNF违例,假设为X→Y。计算X+。选择R1=X+作为一个关系模式,并使另一个关系模式R2包含属性X以及那些不在X+中的属性。
  3. 计算R1和R2的FD集,分别记为S1和S2
  4. 递归地分解R1和R2。返回这些分解得到的结果集合。

举例

《数据库系统基础教程 原书第3版》P52
习题3.3.1 对于下列关系模式和FD集合:
a) R(A,B,C,D) FD{AB→C,C→D,D→A}
b) R(A,B,C,D) FD{B→C,B→D}
c) R(A,B,C,D) FD{AB→C,BC→D,CD→A,AD→B}
d) R(A,B,C,D) FD{A→B,B→C,C→D,D→A}
e) R(A,B,C,D,E) FD{AB→C,DE→C,B→D}
f) R(A,B,C,D,E) FD{AB→C,C→D,D→B,D→E}
做下列事情:
i) 指出所有违反BCNF的FD。不要忘记考虑那些不在上述集合中、但可以由它们推断出但FD。但是,没有必要给出右边含有不止一个属性但BCNF违例。
ii) 根据需要把关系分解为一系列属于BCNF的关系集合。

a) R(A,B,C,D) FD{AB→C,C→D,D→A}

非平凡FD(共14个):
C→A,C→D,D→A,AB→C,AB→D,
AC→D,BC→A,BC→D,BD→A,BD→C,
CD→A,ABC→D,ABD→C,BCD→A

键:AB、BC、BD

违反BCNF的FD(左侧不含键):C→A,C→D,D→A,AC→D,CD→A

可从C→D开始分解,C+=ACD
得到R1=C+=ACD,R2=BC

其中,BC是二元的,满足BCNF

对ACD,有C→A,C→D,D→A,AC→D,CD→A
C为键,D→A不符合BCNF,故仍需分解

D+=AD,分解为AD和CD,都满足BCNF

故分解结果为AD,CD,BC

b) R(A,B,C,D) FD{B→C,B→D}

键:AB
不满足BCNF
从B→C开始分解,B+=BCD,分解为BCD和AB,均满足BCNF

c) R(A,B,C,D) FD{AB→C,BC→D,CD→A,AD→B}

键:AB、BC、CD、AD
满足BCNF,不用分解

d) R(A,B,C,D) FD{A→B,B→C,C→D,D→A}

键:A、B、C、D
满足BCNF,不用分解

e) R(A,B,C,D,E) FD{AB→C,DE→C,B→D}

键:ABE
不满足BCNF

从AB→C开始分解,AB+=ABCD,分解为ABCD和ABE

对ABCD,键为AB,存在B→D不满足BCNF
分解B→D,B+=BD,分解为BD和ABC,均满足BCNF

对ABE,键为ABE,满足BCNF

故分解结果为ABC,BD,ABE

f) R(A,B,C,D,E) FD{AB→C,C→D,D→B,D→E}

键:AB、AC、AD
不满足BCNF

方式1:
从D→B开始分解,D+=BDE,分解为ABC,BDE

ABC的键是AB、AC,存在C→B不满足BCNF
分解C→B,C+=BC,分解为AC,BC,均满足BCNF

BDE的键是D,满足BCNF

故分解结果为AC,BC,BDE

方式2:
从C→D开始分解,C+=BCDE,分解为AC,BCDE

AC满足BCNF

BCDE的键为C,D→B不满足BCNF
分解D→B,D+=BDE,分解为CD,BDE

CD满足BCNF

BDE的键为D,满足BCNF

故分解结果为AC,CD,BDE

  • 61
    点赞
  • 249
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值