数据库BC范式(BCNF)判断和分解

书中的概念:

关系模式R〈U,F〉∈1NF。若X→Y且Y不包含X时X必含有码,则R〈U,F〉∈BCNF。
也就是说,关系模式R〈U,F〉中,若每一个决定因素都包含码,则R〈U,F〉∈BCNF。

关系模式的定义可以得到如下结论,若R属于BCNF,则R有:

1.所有非主属性对每一个码都是完全函数依赖

2.所有的主属性对每一个不包含它的码,也是完全函数依赖。

3.没有任何属性完全函数依赖于非码的任何一组属性。

 

我的理解:

非码属性不要完全决定码属性,主属性也不要部分/传递依赖码属性,

换句话来说,就是X→Y时,X一定含有码(候选码中的任意一个)

如:

例1:

在关系模式STJ(S,T,J)中,S表示学生,T表示教师,J表示课程。

每一教师只教一门课。每门课由一名教师教,某一学生选定某门课,就确定了一个固定的教师。某个学生选修某个教师的课就确定了所选课的名称 : (S,J)→T,(S,T)→J,T→J

显然,在STJ中,(S,J),(S,T)都是候选码,S,T,J都是主属性,所以没有非主属性对码的传递依赖和部分依赖,所以属于3NF。

但是T→J的决定因素既不包含候选码(S,J),也不包含候选码(S,T),所以不是BCNF。

也可以用以上三条结论认证。

(1)当(S,J)为码时,主属性T依旧被码属性J依赖(T→J),违背了以上第3条。

(2)当(S,T)为码时,主属性J依旧被码属性T部分函数依赖(T→J),违背了以上第2条。

综上所述,关系模式STJ不是BCNF。

 

如何将它们改成BCNF呢?

书上有分解法的算法,可以将模式转换为BCNF。书上的很抽象,但是运用起来很简单。简单来说就是把不合法的属性拆出来组成新的模式。

T→J的决定因素既不包含候选码(S,J),也不包含候选码(S,T),所以将其分解,T+J是U的真子集,故分解:S1:{TJ},将被确定的J移除:S2:U-{J}={S,T}

所以原模式被分为ST(S,T)和TJ(T,J)

 

同样的算法,例2:

那么关系模式 dep(D,M,G,N)中D表示仓库名,M表示管理员,G表示货物名,N表示货物的数量 

已知函数依赖集:D → M,M → D,(D,G)→ N

将其分为BC范式:

主属性:D,M,G

候选码:(D,G),(M,G)

D → M,M → D,D和M都不包含候选码(D,G),也不包含候选码(M,G)

此时分解:D → M:S1:{D,M},S2:U-M{D,G,N}   

                 这时,有S1{D → M},候选码D,S2{(D,G)→ N}候选码(D,G),满足BCNF,分解完成。

或者分解:M → D:S1:{M,D},S2:U-D{G,M,N}

                 这时,有S1{M → D},候选码M,S2{(D,M)→ N}候选码(D,M),满足BCNF,分解完成。

所以要想使模式满足BC范式,本例有两种分解方式。

  • 79
    点赞
  • 301
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值