6.1问题的提出
什么问题的提出?
前面的章节讨论了数据库系统的一般概念,介绍了关系数据库的基本概念、关系模型三部分以及关系数据库的标准语言SQL,但是还有一个最基本的问题没有提及:针对一个具体问题,应该如何构造一个适合它的数据库模式,即应该构造几个关系模式,每个关系由哪些属性组成等。这是数据库设计的问题,确切地讲是关系数据库逻辑设计问题。
由于关系模型有严格的数学理论基础,并且可以向别的数据模型转换,所以人们就以关系模型为背景来讨论这个问题,形成了数据库逻辑设计的一个有力工具——关系数据库的规范化理论
在笔记二中,我们叙述过一个关系模式应该是五元组,即
R(U,D,DOM,F)
关系名R是符号化的元组语义
U为一组属性
D为属性组U中的属性所来自的域
DOM为属性到域的映射
F为属性组U上的一组数据依赖
由于D、DOM与模式设计关系不大,所以本章把关系模式看成一个三元组即
R<U,F>
当且仅当U上的一个关系r满足F时,r称为关系模式R<U,F>的一个关系
第一范式是什么?
每个分量必须是不可分的数据项,满足这个条件的关系模式就属于第一范式(1NF)
在这里先说一下非形式下数据依赖的概念
数据依赖是一个关系内部属性与属性之间的一种约束关系。这种约束关系是通过属性间值的想等与否体现出来的数据间的相关联系。它是现实世界属性相互联系的抽象,是数据内在的性质,是语义的体现。
数据依赖中最重要的是函数依赖Functional Dependency和多值依赖Multi-Valued Dependency
函数依赖是什么呢?
简单来说某一个函数决定了另一个函数,比如一个学号决定了某个学生名字,类似数学中的函数y=f(x)般,即Sname=f(Sno),这样的依赖就称作函数依赖,即Sno函数决定Sname函数,Sname函数依赖于Sno
在不规范的数据库中,常常出现以下几个问题:
①数据冗余:比如数据库中每一个职员都对应一个相同的boss,则boss的资料出现的太频繁,浪费了太多的空间
②更新异常:比如更新数据库中一个boss的资料时,需要把下属的资料一起更改
③插入异常:一个公司刚刚成立,没有职工,则无法把boss信息存入数据库,因为boss对应着某些职工的信息
④删除异常:在删除职工的信息时把boss的信息也删除了
综上,一个好的模式应当不会发生插入异常、删除异常和更新异常、数据冗余应尽可能少
接下来我们来讨论怎么样能够使数据库模式变得更好,即规范化问题
6.2规范化
6.2.1函数依赖
定义:设R(U)是属性集U上的关系模式,X,Y是U的子集。若对于R(U)的任意一个可能的关系r,r中不可能存在两个元组在X上的属性值相等,而在Y上的属性值不等,则称X函数确定Y或Y函数依赖于X,记作X→Y。
其实这个很好理解,即上面的说的学号和姓名的关系(比如这个就是关系r),如果学号X确定了,则在任何元组中,姓名Y都是固定的,则称学号确定姓名或姓名依赖于学号,学号→姓名
函数依赖和别的数据依赖一样是语义范畴的概念,只能根据语义来确定一个函数依赖
比如姓名→年龄这个函数依赖只有在该部门没有同名人的条件下成立,如果允许有同名人则依赖失效了
有关的一些术语和记号:
对于任一关系模式,平凡函数依赖都是必然成立的,它不反映新的语义。若不特别声明,总是讨论非平凡的函数依赖。
下面的完全函数依赖,部分函数依赖和传递函数依赖的定义
简单来说,完全函数依赖就是一个非主属性完全依赖于一个候选码,比如在一个学号,课程号,系别,成绩的属性组中,候选码是学号和课程号,成绩是由学号和课程号共同决定得出的,而系别只要学号就可以确定了,则成绩就是完全依赖,系别就是部分依赖
如有看概念和例子对以上依赖不明白的同学可以私聊滴滴作者。
6.2.2码
关于码的概念还是比较抽象的,笔者在这里进行理解性的叙述一下
首先什么是候选码,候选码首先是一个属性或一个属性组,其次是可以决定一个属性,比如学号能决定姓名,学号就是候选码,学号和课程号可以决定某个课程的成绩(通过学号可以知道姓名,通过姓名+课程号可以知道成绩)则学号和课程号这个属性组合也是候选码
有多个候选码就选一个作为主码
在候选码中的属性就被称为主属性,没有在候选码中的属性就称为非主属性,比如上面的例子中,学号和课程号就是主属性,成绩就是非主属性
全码就是整个属性组都是候选码,谁都可以决定谁,这样的就是全码,也称all key。
定义:关系模式R中属性或属性组X并非R的码,但X是另一个关系模式的码,则称X是R的外部码foreign key,也称外码
这个在前面的笔记中有过举例,这里不再叙述
6.2.3范式
关系数据库中的关系是要满足一定要求的,满足不同程度要求的为不同范式。满足最低要求的叫做第一范式,简称1NF,以此类推
各种范式之间的关系有
5NF⊂4NF⊂BCNF⊂3NF⊂2NF⊂1NF
可以这样理解,1NF是粗糙的石头,打磨分解后就变的光滑就2NF
即:一个低一级范式的关系模式通过模式分解schema decomposition可以转换成若干个高一级范式的关系模式的集合,这种过程就叫规范化normalization
6.2.4 2NF
定义:若R∈1NF,且每一个非主属性完成函数依赖于任何一个候选码,则R∈2NF
即消除了非主属性对码的部分函数依赖
6.2.5 3NF
6.2.6 BCNF
通常认为BCNF是修正的第三范式,或者扩充的第三范式
由BCNF的定义可以得出结论,一个满足BCNF的关系模式有:
所有非主属性对每一个码都是完全函数依赖
所有主属性对每一个不包含它的码也是完全函数依赖
没有任何属性完全函数依赖于非码的任何一组属性
即消除了主属性对码的部分和传递依赖
注意是主属性,2NF和3NF是非主属性
即,每一个关系中,只有一个决定因素。不要这个主属性可以决定另一个主属性,比如在学生,教师,课程的关系中,学生和老师可以决定上的是哪一门课程,学生和课程可以决定是哪一个老师上课,这样的话,老师算不算决定因素?课程算不算决定因素?即BCNF要消除这个依赖。
6.2.7多值依赖
多值依赖简单来举个例子就是,有一个关系r中有{学科x,学科对应的书籍z}还有一个值是老师y,这个老师y仅仅取决于这个学科x,而与z值无关,这样的就是多值依赖
多值依赖具有以下性质:
①多值依赖具有对称性。即若X→→Y,则X→→Z,其中Z=U-X-Y
②多值依赖具有传递性。即若X→→Y,Y→→Z,则X→→Z
③函数依赖可以看作是多值依赖的特殊情况,即若X→Y,则X→→Y
④若X→→Y,X→→Z,则X→→YZ
⑤若X→→Y,X→→Z,则X→→Y∩Z
⑥若X→→Y,X→→Z,则X→→Y-Z,X→→Z-Y
多值依赖与函数依赖相比具有两个基本的区别
(1)多值依赖的有效性与属性集的范围有关
(2)若函数依赖X→Y在R(U)上成立,则对于任何Y’⊂Y均有X→Y’成立。而多值依赖X→→Y若在R(U)上成立,却不能断言对于仍和Y’⊂Y有X→→Y’成立
6.2.8 4NF
即消除非平凡且非函数依赖的多值依赖
换句话说
都是平凡的函数依赖的多值依赖
6.2.9规范化小结
规范化实质上的概念的单一化