关系型数据库理论进阶

关系数据理论

针对一个具体问题, 如何构造适合的数据模型. 即应该构造几个关系, 每个关系的组成属性等.


例子1

现需要开发一个学校教务数据库, 涉及的对象有 :

  • 学生学号(Sno), 学生院系(Sdept), 系主任名(Mname), 课程号(Cno), 成绩(Grade)

语义有 :

  1. 一个系有若干个学生, 但一个学生只属于一个系;
  2. 一个系只有一名主任;
  3. 一个学生可以选修多门课程, 每门课程有若干学生选修;
  4. 每个学生所学的每门课程都有一个成绩.

设计一个关系模式如下

STUDENT(Sno, Sdept, Mname, Cno, Grade)

这样的设计显然是有问题的 :

  1. 数据冗余 , 浪费空间 (例如系主任的名字重复出现多次)
  2. 更新异常 (例如要更新系主任的名字, 则要在这个系有关的所有元组都更新)
  3. 插入异常 (例如一个新的系暂时没有招生, 则无法插入系和系主任的信息)
  4. 删除异常 (例如一个系的学生全毕业了, 删除这些学生信息的同时, 系主任和系的信息也被删除了)

之所以有这些问题是由于模式中某些数据依赖引起的

一个好的模式应该: 不会发生插入异常, 更新异常, 删除异常, 数据冗余度小
解决的半发就是 : 消除其中不合适的数据依赖

设计一个新的关系模式如下

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 }
上述依赖集合可表示为 :
关系数据理论-例1关系集合图.png

数据依赖是完整性约束的一种表现形式

  • 限定属性取值范围 (例如学生成绩只能是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>的一个关系