1-3NF,BCNF,最小依赖集,模式分解,判断是否为无损分解
1NF----表中每一列都不能再分解了(stomic)
2NF----满足1NF,并且非主键属性不能不分依赖于主键
e.g A B C D E 其中A和B为主键,如果A能单独决定C的属性,那么就不符合2NF.
BTW:如果主键只有一个,那肯定2nf
3NF----满足2NF,人话就是 不存在这个关系:关键字段------>非关键字段x-------->非关键字段y
就是说所有的非主键属性只能由主键来决定
BCNF-----满足3NF,人话:AC--->J AC必须包含候选键,也就是关系模式的左部必须包含候选键
最小依赖集:
简单来说就是求闭包,找冗余https://blog.****.net/wonz5130/article/details/80465245观摩了这篇文章
我把左部和右部合在一起算:
U=(A,B,C,D,E,G) F={BG->C,BD->E,DG->C,ADG->BC,AG->B,B->D}
求闭包前,先把右部单一化,就是ADG->BC变成ADG->B和ADG->C
求闭包:(这里因冗余而去掉的关系不能再用)空格分隔自身和能推倒出来的
(BG)+ = BG DCE ->C 闭包包含C,所以去掉
(BD)+ = BD D ->E 因为闭包中有两个D(其中一个是BD自身)所以可以得出 B -> E
(DG)+ = DG -> C保留
(ADG)+ = ADG CBC ->B 因为有B 所以去掉, 这里虽然有两个C 但是ADG本身没C,ADG也不是->C。所以不用管
(ADG)+ = ADG CBD -> C 同理 去掉
(AG)+ = AG BDEC -> B 去掉
(B)+ = B ->D 留着
所以最后最小依赖集就是Fm={B->E, DG->C, AG->B, B->D}
我看到原文章中有人说BD->E中D不能去掉,--B->E可以推出 BD---->DE 又因为B->D 所以BD->E
关系模式分解为3NF:
https://blog.****.net/Wonz5130/article/details/80466282还是那位老哥
关系模式分解为BCNF:
这个有几个步骤:
1. 先求候选键
2.如果F中不满足BCNF就分解(左部包含候选键)
U=(A,B,C,D,E,) F={A->B, AC->D, DB->E}
在这个例子中,F是最小依赖集(先求最小依赖集,后面好算)
这里F的候选键为AC
下一步之前先上个图
这个图里重点看最后一句 replacer Ri by ....
E.G U=(A,B,C,D,E,) F={A->B, AC->D, DB->E}
候选键AC
第一个关系模式显然不符合BCNF(左部没候选键)
所以要把它分解为R1,R2。根据上图X->Y对应A->B,所以用F-B 和 AUB作为R1,R2
R1={(ACDE),(AC->D, AD->E)}这个AD->E怎么来的呢,就是通过F中的关系转换的出来(因为要除去B)
R2={(AB),(A->B)}
因为R1,R2的最小依赖集就是自己本身,而且R1候选键依然为AC,R2就剩一个关系模式自然满足BCNF
R1不满足BCNF再次进行分解(先求最小依赖集和新的候选键,在这例子中不变)
因为R1只有两个关系模式,所以直接分解为R12,R11
R11={(ACD),(AC->D)}
R12={(ADE),(AD->E)}
判断是否为无损:
还是那位老哥https://blog.****.net/Wonz5130/article/details/80502746
因为我看不太懂所以附上参考材料https://wenku.baidu.com/view/b0f18770fab069dc5122012c.html
简单来说,先看第一篇文章,知道怎样建矩阵,然后判断方法就根据第二篇,比如A->D, 如果有两行在A列上相等而在D列上不相等,1.如果D列上有a,则把对应的两行都改为a
2.没有a就用D列上的b代替
BC->D这些也一样,找到BC列上相等的两行并且对应到D中,完美
最后只要看看矩阵中有没有哪一行全都是a,有就是无损了