关系型数据库理论进阶
关系数据理论
针对一个具体问题, 如何构造适合的数据模型. 即应该构造几个关系, 每个关系的组成属性等.
例子1
现需要开发一个学校教务数据库, 涉及的对象有 :
- 学生学号(Sno), 学生院系(Sdept), 系主任名(Mname), 课程号(Cno), 成绩(Grade)
语义有 :
- 一个系有若干个学生, 但一个学生只属于一个系;
- 一个系只有一名主任;
- 一个学生可以选修多门课程, 每门课程有若干学生选修;
- 每个学生所学的每门课程都有一个成绩.
设计一个关系模式如下
STUDENT(Sno, Sdept, Mname, Cno, Grade)
这样的设计显然是有问题的 :
- 数据冗余 , 浪费空间 (例如系主任的名字重复出现多次)
- 更新异常 (例如要更新系主任的名字, 则要在这个系有关的所有元组都更新)
- 插入异常 (例如一个新的系暂时没有招生, 则无法插入系和系主任的信息)
- 删除异常 (例如一个系的学生全毕业了, 删除这些学生信息的同时, 系主任和系的信息也被删除了)
之所以有这些问题是由于模式中某些数据依赖引起的
一个好的模式应该: 不会发生插入异常, 更新异常, 删除异常, 数据冗余度小
解决的半发就是 : 消除其中不合适的数据依赖
设计一个新的关系模式如下
S (Sno, Sdept, Sno -> Sdept)
SC (Sno, Cno, Grade, (Sno, Cno) -> Grade)
DEPT (Sdapt, Mname, Sdept -> Mname)
这种模式设计消除了部分不合适的数据依赖
这样就不会产生插入异常, 更新异常, 删除异常的问题, 数据冗余度也得到了控制
将这种好的经验上升为理论, 就是 : 利用规范化理论改造关系模式, 消除其中不合适的数据依赖.
数据依赖
上例中第一种关系模式 : STUDENT(Sno, Sdept, Mname, Cno, Grade)
其中 : Sdept = f(Sno) , 即Sno以某种函数的方式确定了Sedpt, 记作Sno -> Sdept
其中 : Mname = f(Sdept) , 即Sdept函数确定Mname, Sdept -> Mname
其中 : Grade = f((Sno, Cno)), (Sno, Cno)函数确定Grade, (Sno, Cno) -> Grade
则该关系模式的属性集合 : U = { Sno, Sdept, Mname, Cno, Grade }
该属性组上的函数依赖集合 : F = {Sno->Sdept, Sdept->Mname, (Sno,Cno)->Grade }
上述依赖集合可表示为 :
数据依赖是完整性约束的一种表现形式
- 限定属性取值范围 (例如学生成绩只能是0-100)
- 定义属性值间的关联 (主要体现于值相等与否)
- 数据库模式设计的关键
数据依赖
- 是通过关系中属性值的相等与否体现数据间的相互关系
- 是现实世界属性间相互关系的抽象
- 是数据内在的性质
- 是语义的体现
数据依赖的主要类型
- 函数依赖 (Functional Dependency, FD)
- 多值依赖 (Multivalued Dependeccy. MVD)
- 连接依赖
- …
数据依赖对关系模式的影响
- 不适合的数据依赖,造成插入异常, 删除异常, 更新异常和数据冗余
关系模式的简化表示
关系模式的形式化定义
R ( U , D , DOM , F)
R : 关系名, 是符号化的元组语义
U : 关系的属性集合
D : 属性组U中属性所来自的域
DOM : 属性向域的映像集合
F : 属性间数据的依赖关系集合
关系模式的简化表示
R < U , F >
将关系模式简化为三元组, 影响数据库设计模式的主要是U和F
当且仅当U上的与给关系 r 满足F时, r 称为关系模式R<U,F>的一个关系