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观摩了这篇文章
先右边单一化
然后左边单一化
最后去冗余
关系模式分解为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
下一步之前先上个图
这个图里重点看最后一句 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.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,有就是无损了