一、前言
在解决一个具体问题时,要构造一个属于该问题的数据模式,设计一个较好的关系模式,因而我们需要学习关系数据库
二、关系模式存在问题
- 数据冗余
- 更新异常
- 插入异常
- 删除异常
光讲述这四个问题可能大家没有什么概念,那么通过一个例子带大家浏览一下关系模式存在的问题
U = {Sno,Sdept,Mname,Cno,Grade}
Sno | Sdept | Mname | Cno | Grade |
S1 | 计算机系 | 张教授 | C1 | 95 |
S1 | 计算机系 | 张教授 | C1 | 89 |
S2 | 计算机系 | 张教授 | C1 | 92 |
S3 | 计算机系 | 张教授 | C1 | 78 |
S3 | 计算机系 | 张教授 | C1 | 83 |
语义如下:
1.一个系有若干学生,但一个学生只属于一个系
2.一个系只有一个正职负责人
3.一个学生可以选多门课,每门课有若干学生选修
4.每个学生学习每门课有一个成绩
关系模式存在的问题
1.数据冗余:系主任的名字重复出现
2.更新异常:由于数据冗余,所以一旦更换系主任后,就要修改与这个系有关的学生的每个元组
3.插入异常:如果有一个刚成立的系,但是没有学生,就没办法将系相关信息存入数据库
4.删除异常:如果某个系的学生都毕业了,那么在删除该系学生信息同时,该系及系主任发信息也就不存在了
三、函数依赖
1.引入
属性组U上的一组函数依赖F如下
F ={Sno→Sdept, Sdept→Mname, (Sno, Cno)→Grade}
2.定义
- 设R(U)是一个属性集U上的关系模式,X和Y是U的子集
- 若对于R(U)的任意一个可能的关系r,r中不可能存在两个元组在X上的属性值相等,而在Y上的属性值不等,则称X函数确定Y或Y函数依赖于X,记作x➡y
- X称为决定因素,Y称为依赖因素
- 函数依赖是语义范畴的概念
- 只能根据数据的语义来确定函数依赖
3.平凡函数依赖与非平凡函数依赖
- X→Y,Y⊈X,则称X→Y是非平凡的函数依赖
- X→Y,Y⊆X ,则称X→Y是平凡的函数依赖
- 若不特别声明,我们一般讨论非平凡函数依赖
例如:
在关系SC(Sno, Cno, Grade)中
非平凡函数依赖: (Sno, Cno) → Grade
平凡函数依赖: (Sno, Cno) → Sno,(Sno, Cno) → Cno
因为Sno包含于(Sno, Cno) 中,Cno包含于(Sno, Cno) 中
4.完全函数依赖和部分函数依赖
- Sno、Cno无法单独与Grade形成依赖关系,但是(Sno、Cno)与Grade可以形成函数依赖的关系,那么(Sno、Cno)与Grade存在 完全函数依赖(F) 关系
- Sno、Cno中的Sno可以单独与Sdept形成依赖关系,并且(Sno、Cno)与Grade不能形成函数依赖的关系,那么(Sno、Cno)与Grade存在 部分函数依赖(P) 关系
5.传递函数依赖