数据库的规范化
文章目录
函数依赖
函数依赖和别的数据依赖一样是语义范畴的概念,只能根据语义来确定一个函数依赖。例如,姓名一年龄这个函数依赖只有在该部门没有同名人的条件下成立。如果允许有同名人,则年龄就不再函数依赖于姓名了。
下面介绍一些术语和记号。
码
若候选码多于一个,则选定其中的一个为主码(primary key)。
包含在任何一个候选码中的属性称为主属性(prime attribute);不包含在任何候选码中 的属性称为非主属性(nonprime attribute)或非码属性(non-key attribute)。
最简单的情况,单个属性是码;最极端的情况,整个属性组是码,称为全码(all-key)。
关系模式R中属性或属性组X并非R的码,但X是另一个关系模式的码,则称X是R外部码(foreign key),也称外码。
范式
关系数据库中的关系是要满足一定要求的,满足不同程度要求的为不同范式。满足最低 要求的叫第一范式,简称1NF;在第一范式中满足进一步要求的为第二范式,其余以此类推。
1NF
1NF:关系模式R中的所有属性都是不可分的基本数据项(平时使用时不拆分某一数据项).
2NF
消除非主属性对码的部分函数依赖.
只要码是单个属性,必为2NF.
[例6.4]有关系模式S-L-C(Sno, Sdept, Sloc,Cno, Grade),其中Sloe为学生的住处,并且每个系的学生住在同一个地方。S-L-C的码为(Sno, Cno)。则函数依赖有
可以看到非主属性Sdept、Sloc并不完全函数依赖于码。因此 S-L-C (Sno, Sdept,Sloc,Cno,Grade)不符合 2NF 定义.
解决的办法是用投影分解把关系模式 S-L-C 分解为两个关系模式:SC(Sno, Cno, Grade)和 S-L(Sno, Sdept, Sloc)。
关系模式SC的码为(Sno,Cno),关系模式S-L的码为Sno,这样就使得非主属性对码都是完全函数依赖了。
3NF
消除非主属性对码的部分和传递依赖.
若只有2列,必为3NF.
如果属于3NF,则必属于2NF。
在上例中S-L(Sno, Sdept, Sloe).存在传递函数依赖,所以不属于3NF.
BCNF
排除非主属性和主属性对码的部分和传递函数依赖
由BCNF的定义可以得到结论,一个满足BCNF的关系模式有:
- 所有非主属性对每一个码都是完全函数依赖。
- 所有主属性对每一个不包含它的码也是完全函数依赖。
- 没有任何属性完全函数依赖于非码的任何一组属性。
例:关系模式STJ(S, T, J)中,S表示学生,T表示教师,J表示课程。每一教师只教一门课,每门课有若干教师,某一学生选定某门课,就对应一个固定的教师。由语义可得到如下的函数依赖。
这里(S,J)、(S,T)都是候选码。
STJ是3NF,因为没有任何非主属性对码传递依赖或部分依赖,但STJ不是BCNF关系,因为T是决定因素,而T不包含码。
多值依赖
例:学校中某一门课程由多个教师讲授,他们使用相同的一套参考书。每个教师可以讲授多门课程,每种参考书可以供多门课程使用。可以用一个非规范化的关系来表示教师T、课程C和参考书B之间的关系.
当某一课程(如物理)增加一名讲课教师(如周英)时,必须插入多个(这里是三个)元组:(物理,周英,普通物理学),(物理,周英,光学原理),(物理,周英,物理习题集)。
同样,某一门课(如数学)要去掉一本参考书(如微分方程),则必须删除多个(这里是两个)元组:(数学,李勇,微分方程),(数学,张平,微分方程)。因而对数据的增删改很不方便,数据的冗余也十分明显。
仔细考察这类关系模式,发现它具有一种称之为多值依赖的数据依赖。
例如,在关系模式Teaching中,对于一个(物理,光学原理)有一组丁值{李勇,王军}, 这组值仅仅决定于课程C上的值(物理)。也就是说对于另一个(物理,普通物理学),它 对应的一组T值仍是{李勇,王军},尽管这时参考书B的值已经改变了。因此T多值依赖 于C.
4NF
4NF就是限制关系模式的属性之间不允许有非平凡且非函数依赖的多值依赖。4NF所允许的非平凡的多值依赖实际上是函数依赖。显然,如果一个关系模式是4NF,则必为BCNF。
文章作者 Forz
上次更新 2017-08-15