关系数据库设计基础理论
关系数据库逻辑设计
- 针对具体问题,如何构造一个适合于它的数据模式。 (应该设
计多少个关系模式、每个关系模式由哪些属
性构成、关系模式之间的联系) - 设计目标:避免出现
- 过多数据冗余
- 更新异常
- 插入异常
- 删除异常
- 解决方案:数据库逻辑设计的工具----关系数据库规范化理论
函数依赖和Armstrong公理
- 关系模式的形式化定义(五元组)
- R(U,D,DOM,F)
- R: 关系名
- U: 组成该关系的属性名集合
- D: 属性组U中属性所来自的域
- DOM: 属性向域的映像集合
- F:属性间数据依赖的集合
注:
数据依赖:定义关系内部属性值间的相互关连(主要体现于值的相等与否), 它是数据库模式设计的关键
- 数据依赖类型(函数依赖、多值依赖)
- 函数依赖 (Functional Dependency,简记为FD)
关系R上的FD指:如果R的两个记录在属性A1,A2....,An上一致(这些属性上对应的分量相同),则它们在其他分量B上的值也必定相同
记做 A1A2....An-----B 即A1,A2,....,An函数决定B
合并规则(combinling rule)
如果A1,A2...An --- Bi(i=1,2,...m),则A1A2...An-----B1B2Bm
分解规则(Splitting rule)
如果A1A2...An ---- B1B2Bm ,则A1A2...An---Bi(i=1,2,...m)
例: 建立一个描述学校教务的数据库:
学生的学号(Sno)、所在系(Sdept)、系主任姓名(Mname)、课程名(Cname)、成绩(Grande)
用单一关系模式描述:Student<U、F>
U={Sno,Sdept,Mname,Cname,Grande}
规则
- 一个系有若干个学生,而一个学生只属于一个系。
- 一个系只有一名(正职)负责人--系主任
- 一个学生可选多门课程,每门课程有若干个学生选修
每个学生选每门课有一个成绩
F= {Sno--- Sdept,Sdept--Mname,(Sno,Cname)---Grade}
![]()
问题:
数据冗余: 系主任的名字重复出现
更新异常:系主任更换,则需要更换所有学生相应的信息
插入异常:如某系刚成立,没有学生,则不能插入系的相关信息
删除异常:删除所有学生信息,则删除了一个系的信息
解决方法:可以通过分解关系模式来消除其中不合适的数据依赖。把这个单一模式分成3个关系模式
S{Sno,Sdept,Sno---Sdept}
SC{Sno,Cno,Grade,(Sno,Cno)---Grade}
DEPT{Sdept,Mname,Sdept---Mname}
函数依赖形式定义:
设R(U)是一个属性集U上的关系模式,X和Y是U的子集
若对于R(U)的任意一个可能的关系r,r中不可能存在两个元组在X上的属性值相等,而在Y上的属性值不等,则称“X函数确定Y”或“Y函数依赖于X”,记作X---Y
函数依赖的类型
- 平凡的:
![]()
- 非平凡的:Y中至少有一个属性不属于X
- 完全非平凡: Y中所有属性均不属于X
完成函数依赖
在R(U)中,如果X---Y,并且对于X的任何一个真子集X,都有X 不能推导出Y,则称Y对X完全函数依赖
(Sno,Cno)---Grade
部分函数依赖
若X---Y,但Y不完全依赖于X,则称Y对X部门函数依赖,记作
(Sno,Cno)---Sdept (只要有学号就能推导出来系别)
传递函数依赖
Y---Z
,则Z对X传递函数依赖
X---- Z
eg:
在关系Std(Sno,Sdept,Mname)中,有
Sno---Sdept,Sdept---Mname
Mname传递函数依赖于Sno
若想知道一个FD是否从指定的FD集合中导出,经常使用闭包算法。但可以使用Armstrong公理的一组规则得到一个给定集合能推断出的FD
关系模式R(U,F)来说有以下的基本规则
根据三条基本规则可以得到以下推理规则
合并规则: