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.csdn.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.csdn.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

下一步之前先上个图 

1-3NF,BCNF,最小依赖集,模式分解,判断是否为无损分解

这个图里重点看最后一句 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)}

1-3NF,BCNF,最小依赖集,模式分解,判断是否为无损分解

 

判断是否为无损:

还是那位老哥https://blog.csdn.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,有就是无损了