为什么引⼊范式?
1数据冗余
2更新异常
3插⼊异常
4删除异常
范式分类
设计关系数据库时,遵从不同的规范要求,这些不同的规范要求被称为不同的范式, 各种范式呈递次规范,越⾼的范式数据库冗余越⼩。
⽬前关系数据库有六种范式:
第⼀范式(1NF)、第⼆范式(2NF)、第三范式(3NF)、 巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,⼜称完美范式)
。
⼀般来说,数据库只需满⾜第三范式(3NF)就⾏了。
参考博客:https://wonzwang.blog.csdn.net/article/details/80464466
候选码的概念: 可以推出所有属性
如何选出候选码?
- 只出现在左边的⼀定是候选码
- 只出现在右边的⼀定不是候选码
- 左右都出现的不⼀定
左右都不出现的⼀定是候选码
- 再求确定的候选码的闭包,如果可以推出全部,那么当前确定的就是候选码,否则就不是
参考博客:求候选键/候选码
解答:
故候选码为ABD、BCD、BDE
以3.2的例题为例
超码
: 能表示出所有属性的集合, ⽐如 (ABD),(BDC),(BDE) BDCA BDEA ABCDE
候选码
:是最⼩的超码
主码
: 从候选码⾥⾯任意跳出⼀个 作为主码
主属性
: 包含在所有候选码的属性 ⽐如ABCDE
⾮主属性
: 不包含在候选码中的属性 ,上题为G
全码
: 所有的属性都是主码
参考博客:求范式
R(U)=(ABCDEG),F={AB->C,CD->E,E->A,A->G},判断关系模式R(U,F)属于第几范式?
解答:
显然,只有一个非主属性G,A->G,G部分依赖于候选码,所以,R(U,F)属于1NF。
将关系S-L-C规范化,使其满足2NF。
解决方法:将S-L-C分解为两个关系模式,以消除这些部分函数依赖。
另一个例子:
例子(消除传递函数依赖):
自反性:可根据平凡函数依赖
来理解
如何求最⼩依赖集?
拆右边为多个元素的
⽐如A->BC 拆为 A->B 和A->C除去一个依赖 temp(从左往右)
【设:temp的左边取名为t1,右边为t2】,求 t1 的闭包,看“ (t1)+ ”能不能推出“t2”,
若能,该依赖就去掉,否则保留。循环执行
(即每一个依赖都要这样做)左边最小化
,比如:
最终的F即最小函数的依赖集
参考博客:求最小依赖集
无损连接分解(方法一:判定表法)
参考博客:判断是否为无损连接分解
无损连接分解(方法二:无损连接定理)+ 保持函数依赖的证明
参考博客:判断是否为无损连接,保持函数依赖
7.3和7.4解答----参考博客:求模式分解