文章目录
范式
什么是范式
范式 是符合某一种级别的关系模式的集合。构造数据库必须遵循一定的规则。在关系数据库中,这种规则就是范式。关系数据库中的关系必须满足一定的要求,即满足不同的范式。
满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了。
函数依赖
在学习范式前,我们还需要了解函数依赖。
1. 函数依赖的定义
函数依赖(functional dependency,FD)是一种完整性约束,是现实世界事物属性之间的一种制约关系,它广泛地存在于现实世界中。
图1可称α函数确定β,或β函数依赖于α,记作α→β。
2. 平凡函数依赖与非平凡函数依赖
3. 完全函数依赖和部分函数依赖
注:可以看出,当α是单属性是,α→β完全函数依赖总是成立的。
4. 传递函数依赖
若α→β,β→γ和α→γ都是非平凡函数依赖,且β→α不成立,则称α→γ是传递函数依赖。
第一范式(1NF)——码
定义
如果一关系模式r(R)
的每个属性对应的域值都是不可分的,则称r(R)
属于第一范式(1NF),记为r(R)
∈1NF。
目标
将基本数据划分成称为实体集或表的逻辑单元,当设计好每个实体后,需要为其指定主码。
第二范式2NF——全部是码
定义
如果一个关系模式r(R)
∈1NF,且所有非主属性都完全依赖于r(R)
的候选码,则称r(R)
属于第二范式(2NF),记作r(R)
∈2NF。
设有一关系模式
r(R)
,α ⊆ R。若α包含在
r(R)
的某一个候选码中,则称α主属性,否则α为非主属性。如:
r(R)
=r(A,B,C,D),候选码为AB和AD,那么A、B、D就是主属性,C是非主属性。
也就是说,对于满足1NF的关系模式,如果有复合候选码(即多个属性共同构成的候选码),那么非主属性不允许依赖于部分的候选码属性,必须完全依赖于全部的候选码属性——全部是码。
目标
将只部分依赖于候选码(即依赖于候选码的部分属性)的非主属性通过关系模式分解到其他表当中。
第三范式3NF——仅仅是码
定义
如果一个关系模式r(R)
∈2NF,且所有非主属性都直接依赖于r(R)
的候选码(即不存在非主属性传递依赖于候选码),则称r(R)
属于第三范式(3NF),记为r(R)
∈3NF。
也就是说,对于满足2NF的关系模式,非主属性不能依赖于另一个(组)非主属性(这样就形成了对于候选码的传递依赖),即非主属性只能直接依赖于候选码——仅仅是码。
目标
将不直接依赖于候选码(即传递依赖于候选码)的非主属性通过关系模式分解到其它表中去。
总之,所有的非主属性应该直接依赖于(即不能存在传递依赖,这是3NF的要求)全部候选码(即必须完全依赖,不能存在部分依赖,这是2NF的要求)。
Boyce-Codd范式BCNF
定义
给定关系模式r(R)
∈1NF,函数依赖集F,若F+(F的闭包)中的所有函数依赖α→β至少满足下列条件之一:
- α→β是平凡函数依赖(即β⊆α)
- α是
r(R)
的一个超码(即α中包含r®的候选码)
则称r(R)
属于Boyce-Codd范式,记为r(R)
∈BCNF。
从函数依赖角度可得出,一个满足BCNF的关系模式必然满足下列结论:
- 所有非主属性都完全依赖于每个候选码
- 所有主属性都完全依赖于每个不包含它的候选码。
- 没有任何属性完全函数依赖于非候选码的任一组属性。
因此,BCNF不仅排除了任何属性(包括主属性和非主属性)对候选码的部分依赖和传递依赖,而且派出了主属性之间的传递依赖。BCNF确保了通过函数依赖不能再查出任何冗余,即只考虑函数依赖关系时,BCNF已是最好的范式。
做题方法
求候选码
将关系模式r(R)
里的所有属性分为4类
- L:只存在依赖集左边的属性(一定是候选码的属性)
- R:只存在依赖集右边的属性
- LR:存在于依赖集左右两边的属性(可能是候选码的属性)
- N:不存在于依赖集的属性
求候选码顺序
- 将关系模式
r(R)
里的L类和LR类属性写出来- 求L类里的所有属性组成的属性集的闭包
- 如果闭包等于
r(R)
里的所有属性,那么该属性集就是候选码,到此结束- 不等于则进入第3步
- 将LR类里的属性逐个加进L类的属性集,然后求新属性集的闭包
- 如果闭包等于
r(R)
里的所有属性,那么该新属性集就是候选码;- 如果不是则该新属性集不是候选码;
- 继续第3步,直至遍历完LR类所有属性
判断最高满足哪种范式
例题
【例1】对于关系模式r(R)
=r(A,B,C,D),判断下列关系模式r(R)
的候选码和最高满足哪种范式?
- F1={C→D,C→A,B→C};
- F2={ABC→D,D→A};
- F3={A→B,BC→D};
解:
- 候选码为:B;因为存在传递依赖,所以最高满足2NF;
- 候选码为:ABC和BCD;因为存在依赖D→A,D不是r®的超码,所以最高满足3NF;
- 候选码为:AC;因为B部分依赖于候选码AC,所以最高满足1NF。