3NF、BCNF和4NF基本概念和分解

一、第三范式(3NF)——相对于BCNF,允许存在主属性对候选码的传递依赖和部分依赖

定义:如果关系模式R∈2NF,且每个非主属性都不传递函数依赖于R的主关系键,则称R属于第三范式,简称3NF。

1、把一个关系模式分解成3NF,使它具有保持函数依赖性

算法如下:

其中提到了最小函数依赖集,那么最小函数依赖集怎么求呢?方法如下:

举个例子:在R(U,F)中,U=ABCDEG,F={BD,DGC,BDE,AGB,ADGBC}

1.1首先求最小依赖集

(1)右部属性单一化,F={BD,DGC,BDE,AGB,ADGB,ADGC}

(2)去掉左边多余属性,只针对非单属性

DGC,若去掉D,则G+=G不包含C,D保留(不冗余),若去掉G,(D+=D不包含C,G保留

BDE,(D+=D,(B+=BDE包含E,则可以BE代替此函数依赖

AGB,G+=G,(A+=A

ADGB,(DG+=DGC,(AG+=AGB包含B,则可以由AGB代替

ADGC,(DG+=DGC包含C,则可以由DGC代替

所以最小依赖集F={BD,DGC,BE,AGB}

(3)去掉多余的依赖

去掉BD,(B+=BE,不包含D,则不冗余,不去掉

去掉DGC,(DG+=DG,不包含C

去掉BE,(B+=BD,不包含E

去掉AGB,AG+=AG,不包含B

所以最小依赖集F={BD,DGC,BE,AGB}

1.2R中所有属性都在最小依赖集中出现,转下一步

1.3按照具有相同左部的原则分为:

R1=BDE,R2=DGC,R3=AGB

所以最终分解为ρ={R1(BDE),R2(DGC),R3(AGB)}

2、把一个关系模式分解成为3NF,使它具有保持函数依赖且无损

算法:step1,求F的规范覆盖Fc

  step2,初始化,置ρ={ }

  step3,逐个考察Fc中的每一个FD:XY,如果ρ中的每一个关系模式都不包含XY,则将XY加入ρ

   step4,考察R的候选码,如果ρ中所有关系模式都不包含R的候选码,则将R的某个候选码加入ρ

2.1其中用到了规范覆盖,那么规范覆盖怎么求呢?如下:

步骤1,合并函数依赖,将Fc中如α1→β1α1β2转换成α1→β1β2,得到新函数依赖集F1

步骤2,去除无关属性,找出F1αβ中含有无关属性的函数依赖α→β,去除无关属性后,代替原依赖集

其中步骤2中的无关属性定义:

有了无关属性的定义后,步骤2比较好解决了。

举个例子:r(R)=r(A,B,C)和F={ABC,BC,AB,ABC}计算Fc

合并:ABC与AB合并为ABC,F1={ABC,BC,ABC}

去除无关属性(单属性不存在无关属性):

对于ABC,多属性在左边,去除AB中的A,r={AB}-{A}=B,(B+=BC包含C,所以A无关,变为BC,已存在,F1={BC,ABC}

对于ABC,多属性在右边,去除BC中的B,F2={BC,AC},计算(A+=AC,不包含B,不无关

                                             去除BC中的C,F2={BC,AB},计算(A+=AC,包含C,则BC中的C是无关属性

变为F={BC,AB}

最终规范覆盖Fc={BC,AB}

继续以此题为例,求出候选码,为A,所以依次考察Fc中的BC,初始ρ={},将BC加入ρ中,ρ={R1(BC)}。再考虑AB,ρ中的关系模式不包含AB,则将AB加入ρ中,ρ={R1(BC),R2(AB)}因为候选码A已经在R2中,所以分解结束,最终分解为ρ={R1(BC),R2(AB)}。如果这里最终只有ρ={BC},那么要把候选码A加入进去,则ρ={R1(BC),R2(A)}。这里附上候选码的计算方法:

二、BC范式——排除了任何属性(主、非主属性)对候选码的部分依赖和传递依赖,主属性之间的传递依赖

定义:如果关系模式R∈1NF,且所有的函数依赖XY,决定因素X都包含了R的一个候选键,则称R属于BC范式。

算法:将一个关系模式分解成BCNF

(1)令ρ={R}

(2)如果ρ中所有模式都是BCNF,则转(4)

(3)如果ρ中有一个关系模式S不是BCNF,则S中必能找到一个函数依赖XA且X不是S的候选键,且A不属于X,设S1=XA,S2=S-A,用分解{S1,S2}代替S,转(2)

(4)分解结束,输出ρ

举个例子:将R(A,B,C,D)规范到BCNF,候选键为AC和BC,F={AB,BA,ACD,BCD}

ρ={R(A,B,C,D)},分解为S1(AB),S2(ACD)

三、第4范式(4NF)

定义:

其中涉及到多值依赖的定义,

最终4NF的分解算法如下:

  • 27
    点赞
  • 178
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当一个关系表满足3NF(第三范式),意味着它已经消除了非主属性对于候选键的传递依赖关系。下面是一个例子: 假设我们有一个关系表 "学生课程成绩",包含学生的学号(主键)、课程号(主键)、学生姓名、课程名称和成绩。 | 学号 | 课程号 | 学生姓名 | 课程名称 | 成绩 | |------|--------|----------|----------|------| | 1 | 1001 | 张三 | 数学 | 90 | | 2 | 1002 | 李四 | 英语 | 80 | | 3 | 1001 | 王五 | 数学 | 85 | 在这个例子中,我们可以观察到存在非主属性 "课程名称" 对于候选键 "课程号" 的传递依赖。也就是说,通过课程号可以传递依赖到课程名称。为了满足3NF,我们需要将这个关系表进行分解。 我们可以分解成两个表: 学生表(学号、学生姓名): | 学号 | 学生姓名 | |------|----------| | 1 | 张三 | | 2 | 李四 | | 3 | 王五 | 课程表(课程号、课程名称): | 课程号 | 课程名称 | |--------|----------| | 1001 | 数学 | | 1002 | 英语 | 成绩表(学号、课程号、成绩): | 学号 | 课程号 | 成绩 | |------|--------|------| | 1 | 1001 | 90 | | 2 | 1002 | 80 | | 3 | 1001 | 85 | 现在,我们可以通过主键(学号和课程号)将学生表、课程表和成绩表关联起来,消除了传递依赖,同时满足了3NF。 如果我们进一步要求满足BCNF(Boyce-Codd范式),我们需要检查是否存在非主属性对于候选键的完全依赖关系。在上述例子中,课程表的非主属性(课程名称)完全依赖于候选键(课程号),因此也满足BCNF。 通过使用3NFBCNF范式,可以提高数据库的规范性和结构化程度,减少数据冗余和更新异常的发生。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值