文章目录
第6章:关系数据库理论(考研重点)
代码是基于SQLServer学习,与MySQL有略微差别!
考研复试或者考研科目中可能会考!
6.1、问题的提出
举例:
- 我们要开发一个教务管理系统,信息有:学号,姓名,课号,课名,成绩。
- 首先应该设计数据库来存储信息。
- 针对这个具体系统,应该如何构造一个适合于它的数据库模式,即应该构造几个关系模式,每个关系模式由哪些属性组成等——关系数据库逻辑设计问题
设计一个数据库,只有一个关系模式:
- SC(SNO, SNAME, CNO, CNAME, G)
- 主码:(SNO,CNO)
- 存在问题:
- 冗余度大;e.g:每次插入重复sname、cname
- 更新异常;e.g:修改课名时,只修改了一个
- 插入异常;e.g:新添加一个学生,但是没有选课,cno为null;或者新加一门课,但没有学生选,sno为null
- 删除异常;e.g:删除一名学生的时候,连带着课程也一起跟着删除,可能会导致该课程的缺失
一个好的关系数据库模式应该具备以下四个条件:
- 尽可能少的数据冗余。
- 没有插入异常。
- 没有删除异常。
- 没有更新异常。
问题的解决方案:
- 对关系模式
SC(SNO,SNAME,CNO,CNAME,G)
进行分解;分为下面三个关系模式- S( SNO, SNAM );
- C( CNO, CNAME );
- SC( SNO, CNO, G )
这样是否能解决问题?理论基础是什么?
答:能,关系的规范化理论
6.2、规范化
6.2.1、关系的规范化概述
-
将结构复杂的关系模式分解成结构简单的关系模式,从而把不好的关系数据库模式转变为好的关系数据库模式,这就是关系的规范化。
-
指导关系的规范化有一套完整的理论,称为关系规范化理论。
- 关系数据库模式之所以不好是因为其中有不合适的数据依赖
- 规范化理论正是用来改造关系模式,通过分解关系模式来消除其中不合适的数据依赖,以解决插入异常、删除异常、更新异常和数据冗余问题。
- 关系规范化理论是以数据依赖为基础的。
关系模式可以形式化的表示为
R(U, D, dom, F)
字母 | 含义 |
---|---|
R | 关系名 |
U | 组成该关系的属性名集合 |
D | 属性组U中属性所来自的域的集合 |
dom | 属性向域的映像集合 |
F | 属性间数据依赖的集合 |
在本章中关系模式简记为R(U, F)
6.2.2、数据依赖
数据依赖:关系模式中的各属性之间相互依赖、相互制约的联系
数据依赖是语义的体现
模式分解的目的就是消除不好的函数依赖(部分函数依赖、传递函数依赖)
建立一数据库来存储教务有关信息:
- 学号:Sno、院系名:Sdept、系主任:Mname、课程号:Cno、课程名:Cname、成绩:Grade
- 单一的关系模式 : S(U, F)
U ={Sno, Sdept, Mname, Cno, Cname, Grade}
F是什么?
U={ Sno,Sdept,Mname,Cno,Cname,Grade }
数据库的语义:
一个学生只属于一个系,一个系有若干学生;
Sdept = f(Sno) (Sno --> Sdept)
一个系只有一名系主任;
Sdept --> Mname
一个学生可以选修多门课程, 每门课程有若干学生选修;每个学生所学的每门课程都有一个成绩。
(Sno, Cno) --> Grade
F={ Sno-->Sdept, Sdept-->Mname,(Sno, Cno)-->Grade }
数据依赖一般分为
- 函数依赖( Functional Dependency, 简记为FD )
- 多值依赖(Multivalued Dependency,简记为MVD)
- 连接依赖
其中,函数依赖是最重要的数据依赖。
6.2.3、函数依赖
定义:设R(U)是一个属性集U上的关系模式,X和Y是U的子集。若对于R(U)的任意一个可能的关系 r,r中不可能存在两个元组在X上的属性值相等, 而在Y上的属性值不等, 则称 “X函数确定Y” 或 “Y函数依赖于X”,记作X → Y
Y函数依赖于X 等价于下面:
只要X相等Y就相等
只要Y不相等, X就不相等
对于关系模式:SCD{ SNO,SN,AGE,DEPT,MN,CNO,SCORE }
- SNO → SN
- SNO → AGE
- SN → AGE:学生有重名的情况下,age 不函数依赖与 sn
- SNO →DEPT
- DEPT → MN
- SNO → MN
- SNO → SCORE:学生可能有多门课的成绩,因此 score 不函数依赖于 sno
- (SNO,CNO) → SCORE
几个术语和记号
-
决定因素、依赖因素
若X→Y,我们称X为决定因素,Y为依赖因素。
-
X←→Y
若X→Y,Y→X,则记作X←→Y
-
X ↛ Y
若Y不函数依赖X,则记作X ↛ Y
函数依赖的几点说明
1、函数依赖是语义的体现,我们只能根据语义来确定一个函数依赖。
对于关系模式:SC{SNO, SN, AGE, CNO, SCORE}
- 语义1:学生可以重名 SN ↛ AGE
- 语义2:学生不可以重名 SN → AGE
- 语义3:一名学生可以选多门课: SNO ↛ CNO
- 语义4:一名学生只可以选一门课:SNO → CNO
2、平凡的函数依赖与非平凡的函数依赖。
当属性集Y是属性集X的子集时,则必然存在着函数依赖X→Y,这种类型的函数依赖称为平凡的函数依赖。
- (Sno, Sage) → Sno
- (Sno, Sage) → Sage
- (Sno, Sage) → (Sno, Sage)
如果Y不是X的子集,则称X→Y为非平凡的函数依赖。
对于任一关系模式,平凡函数依赖都是必然成立的,它不反映新的语义,因此若不特别声
明, 我们总是讨论非平凡函数依赖。
3、函数依赖与属性之间的联系类型有关。
在一个关系模式中,如果属性X与Y有1:1联系时, 则存在函数依赖X→Y, Y→X, 即X←→Y。
- 当学生无重名时,SNO与SN有1:1联系, SNO ←→ SN
在一个关系模式中,如果属性Y与X有1:m的联系时,则存在函数依赖X→Y。
- AGE与SNO之间1:m联系,所以有SNO→AGE。
所以在确定属性间的函数依赖关系时,可以从分析属性间的联系类型入手,便可确定属
性间的函数依赖。
函数依赖的基本性质
1、传递性
- 若X→Y,Y→Z ,则有X→Z
- 证明:任意两个元组u, v, 假设其X部分相等。
两个元组u, v的X部分相等,则有Y部分相等(因为X→Y),那么Z部分也肯定相等(因为Y→Z )。
所以X→Z 。
2、扩张性
- 若X→Y且W→Z,则(X,W)→(Y,Z)。
- 例如,对关系模式
SC(SNO,SNAME,AGE, CNO,CNAME,G)
有SNO→(SNAME,AGE),CNO→CNAME
则有(SNO,CNO)→(SNAME,AGE,CNAME)
3、合并性
-
若X→Y且X→Z则必有X→(Y,Z)。
-
例如,对于关系模式
SCD{SNO,SN,AGE,DEPT,MN,CNO,CORE}
SNO→(SN,AGE),SNO→(DEPT,MN),
则有SNO→(SN, AGE, DEPT, MN)。
4、分解性
- 若X→(Y,Z),则X→Y且X→Z。
- 分解性为合并性的逆过程。
完全函数依赖、部分函数依赖、传递函数依赖
(重点)定义:
-
在关系模式R(U)中,如果X → Y,并且对于X的任何一个真子集X’,都有X’↛ Y, 则称 Y完全函数依赖于X,记作X→Y。
-
在关系模式R(U)中,若X → Y,但Y不完全函数依赖于X,则称Y部分函数依赖于X,记作X→Y。
例如,对关系模式:SC(SNO,SNAME,AGE, CNO,CNAME,GRADE)- (SNO,CNO) →F GRADE
- (SNO,CNO) →P AGE
-
在关系模式R(U)中&#x