关系数据库规范化理论
关系模式的形式化定义
关系模式由五部分组成,即它是一个五元组: R(U, D, DOM, F) R: 关系名,即表名 U:
组成该关系的属性名集合D: 属性组U中属性所来自的域。数据的取值范围和类型 DOM: 属性向域的映象集合 F:属性组U上的一组数据依赖。
关系数据库规范化理论研究的就是R、F、U,之间的关系。因为D和DOM对研究表的设计关系不大,所以在学习关系数据库规范化理论时可以将五元组简化成三元组
三元组:
R(U, F)当且仅当U上的一个关系r满足F时,r称为关系模式 R(U, F)的一个关系
什么是数据依赖F?
数据依赖是一个关系内部属性与属性之间的一种约束关系。这种约束关系是通过属性间值的相等与否体现出来的数据间相关联系。 它是现实世界属性间相互联系的抽象,是数据内在的性质,是语义的体现。
-
函数依赖(Functional Dependency,简记为FD) 函数依赖极为普遍地存在于现实生活中。比如描述一个学生的关系,可以有学号(Sno)、姓名(Sname)、 系名(Sdept) 等几个属性。由于一个学号只对应一个学生,一个学生只在一一个系学习。因而当“学号”值确定之后,学生的姓名及所在系的值也就被唯一地确定了。属性间的这种依赖关系类似于数学中的函数y=f(x),自变量x确定之后,相应的函数值y也就唯一地确定 了。
-
多值依赖(Multivalued Dependency,简记为MVD)
-
其他
数据依赖F对关系模式的影响
举个例子:
[例1]建立一个描述学校教务的数据库,数据库涉及的对象有: 学生的学号(Sno)、所在系(Sdept)、系主任姓名(Mname)、课程名(Cname)、成绩(Grade)
这里我们用单一的关系模式Student来表示这些对象: Student <U、F> 该关系的属性集合: U ={ Sno, Sdept, Mname, Cname, Grade }
这里说明一下现实世界的事实语义,关于这些对象之间的联系: ①一个系有若干学生,但一个学生只属于一个系。 ②一个系只有一名(正职)负责人。 ③一个学生可以选修多门课程,每门课程有若干学生选修。 ④每个学生学习每一一门课程有一个成绩。
于是得到属性组U上的一组函数依赖F F={Sno- > Sdept, Sdept- >Mname, (Sno, Cno)- >Grade} (如图所示)
- 如果只考虑函数依赖这一种数据依赖, 可以得到一个描述学生的关系模式Student <U,F>。表6.1是某一时刻关系模式Student的一个实例,即数据表。
这个关系模式设计的并不好,存在以下问题:
1️⃣ 数据冗余(Data redundancy) 比如,每一个系的系主任姓名重复出现,重复次数与该系所有学生的所有课程成绩出现次数相同,如表6.1所示。这将浪费大量的存储空间。 2️⃣ 更新异常(update anomalies ) 由于数据冗余,当更新数据库中的数据时,系统要付出很大的代价来维护数据库的完整性,否则会面临数据不一致的危险。 比如,某系更换系主任后,必须修改与该系学生有关的每一个元组。 3️⃣ 插入异常(insertion anomalies ) 如果一个系刚成立,尚无学生,则无法把这个系及其系主任的信息存入数据库。 4️⃣ 删除异常( deletion anomalies) 如果某个系的学生全部毕业了,则在删除该系学生信息的同时,这个系及其系主任的信息也丢掉了。
鉴于存在以上种种问题,可以得出这样的结论:
- Student关系模式不是一个好的模式。
- “好”的模式: 不会发生插入异常、删除异常、更新异常,数据冗余应尽可能少
- 原因:由存在于模式中的某些数据依赖引起的
- 解决方法:通过分解关系模式来消除其中不合适 的数据依赖
可以把这个单一模式分成3个关系模式:
S(Sno,Sdept,Sno → Sdept);
SC(Sno,Cno,Grade,(Sno,Cno) → Grade);
DEPT(Sdept,Mname,Sdept→ Mname)
这三个模式都不会发生插入异常、删除异常的问题,数据的冗余也得到了控制。 一个模式的数据依赖会有哪些不好的性质,如何改造一个不好的模式,这就是接下来2.规范化要讨论的内容。
函数依赖
- 函数依赖
- 平凡函数依赖与非平凡函数依赖
- 完全函数依赖与部分函数依赖
- 传递函数依赖
① 函数依赖
以下是一个错误的例子:
sno->sdept,sno应该唯一决定sdept
函数依赖和别的数据依赖样是语义范畴的概念,只能根据语义来确定一个函数依赖。 例如,姓名→年龄这个函数依赖只有在该部门没有同名人的条件下成立。如果允许有同名人,则年龄就不再函数依赖于姓名了。
注意:函数依赖不是指关系模式R的某个或某些关系满足的约束条件,而是指R的一切关系均要满足的约束条件。
② 平凡函数依赖与非平凡函数依赖
③ 完全函数依赖与部分函数依赖
④ 传递函数依赖
直接依赖这里我们举个例子:
BH(sno,idCard,address)
X:sno 学号 Y:idCard 身份证号 Z:address 住址 X->Y,Y->X,X<->Y,Y->Z 所以我们说Z直接依赖于X
范式
- 范式是符合某一种级别的关系模式的集合
- 关系数据库中的关系必须满足一定的要求。满足不同程度要求的为不同的范式。
- 级别越高,表设计的越合理
- 某一关系模式
R为第n范式,可简记为R∈nNF。一个低一级范式的关系模式,通过模式分解可以转换为若干个高一级范式的关系模式的集合,这种过程就叫规范化