对数据库范式的理解以及无损分解技巧

1NF范式

属性列是不可拆的(原子的)

2NF范式

非主属性完全依赖于候选码(可以是完全直接依赖,也可以是完全传递依赖)

3NF范式

①要有候选码
②不存在非主属性传递依赖于候选码

即所有非主属性直接依赖于候选码

是3NF一定是2NF
证明:
A,B,C,D
其中(A,B)是候选码 即(A,B)—>C,(A,B)—>D
现在假设 存在部分依赖 即B—>C
所以 (A,B)—>B—>C 即C传递依赖于(A,B),所以不符合3NF 所以假设不成立
因此,是3NF一定是2NF。

BCNF范式

所有依赖的左边都包含候选码

分解成BCNF范式(且是无损分解)

举例说明:
Class(course_id, title, dept_name, credits,sec_id, semester,year ,building, room_number ,capacity, time_slot_id)
函数依赖
course_id->title,dept_name,credits
building,room_number-> capacity
course_id,sec_id,semester,year->building,room_number,time_slot_id

该模式的候选码是{course_id,sec_id,semeter,year}

j解答:
函数依赖 course_id->title,dept_name,credits
成立,但是 course_id不是候选码,因此class不符合BCNF

所以将class替换为
course{ course_id,title,dept_name,credits}
class-1{course_id,credits,sec_id, semester,year ,building, room_number ,capacity, time_slot_id

course存在唯一函数依赖 course_id->title,dept_name,credits 符合BCNF
class-1的候选码为{course_id,sec_id,semeter,year} 函数依赖 building,room_number-> capacity在class-1上成立,但是 building,room_number不会候选码

将class-1替换成
classroom {building,room_number,capacity}
section{building,room_number,course_id,credits,sec_id, semester,year ,building,time_slot_id}

这是class与section均符合BCNF

分解成3NF

例】关系模型R<U,F>,U={A,B,C,D,E},F={A→BC,ABD→CE,E→D}

算法一:将关系R转化3NF的保持函数依赖的分解

第一步:首先计算出F的最小依赖集(算法详见最小函数依赖),得到F’={A→BC,AD→E,E→D}。

第二步:观察U中是否有属性不在F’中的出现,如果有,则这个个属性组成一对关系R,并在原来的U中删除这些属性。而例子中U中的属性都出现在F中,则可以跳过这一步。

第三步:对F’中的函数依赖,把左边的相同分为一组,一组中出现的所有属性为一个关系。如F={A→B,A→C,……},左边都为A的分为一组,出项的所有属性组为一个关系R{A,B,C,……}。例题中左边都不相同,所以一个函数依赖组为一个关系得到转化为3NF的保持依赖分解R1{A,B,C},R2{A,D,E},R3{E,D}。

算法二:将关系R转化3NF的既有无损连接性又保持函数依赖的分解

第一步:先将R转化3NF的保持函数依赖的分解,由算法一得出R1{A,B,C},R2{A,D,E},R3{E,D}。

第二步:求出F的候选码(算法相见候选码算法)得出候选码X为AD和AE。

第三步:将候选码单独组成关系得R4{A,D}和R5{A,E},然后与保持函数依赖后的分解取并集。得R1{A,B,C},R2{A,D,E},R3{E,D},R4{A,D},R5{A,E}。

第四步:观察新组成的分解模式中,是否存在包含关系,有则去掉被包含的。如R3{E,D},R4{A,D},R5{A,E}都包含于R2{A,D,E},则删去,最终得到转化3NF的既有无损连接性又保持函数依赖的分解R1{A,B,C},R2{A,D,E}。

根据函数依赖求最小依赖集

【例1】关系模式R<U,F>,U={A,B,C,D,E},F={A→BC,ABD→CE,E→D},求F的最小依赖集。

第一步:F右边单一化
得到F1={A→B,A→C,ABD→C,ABD→E,E→D}

第二步:逐个去掉X→A依赖后,设剩下函数依赖集为G,求属性集X关于G的闭包,如果闭包包含右边属性A,则去掉该函数依赖。

A→B:(A)+=AC,不包含B,保留。

A→C:(A)+=AB,不包含C,保留。

ABD→C:(ABD)+=ABCDE,包含C,去掉。

ABD→E:(ABD)+=ABCD,不包含B,保留。

E→D:(E)+=E,不包含D,保留。
(在这里,求闭包的时候,不能再用前面去掉的函数依赖了,所以最小依赖集不唯一,写出一个即可。)

所以F2={A→B,A→C,ABD→E,E→D}

第三步:对左边属性单一化,X=B1B2…Bi,逐个用B1→A替代原依赖X→A,判断属性集(X-B1)关于F的闭包,如果包含A则用X-B1代替X。

ABD→E:A→E,求(BD)+=BD,不包含E,不冗余
B→E,求(AD)+=ABCDE,包含E,存在冗余则使用AD→E替换ABD→E
D→E,求(AB)+=ABC,不包含E,不冗余

所以F3={A→B,A→C,AD→E,E→D}
继续第三步
AD→E:A→E,求(D)+=D,不包含E,不冗余
D→E,求(A)+=ABC,不包含E,不冗余

所以最小依赖集Fm={A→B,A→C,AD→E,E→D}

  • 4
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值