4.1 关系模式的规范化
我们先举个例子,如下是学生(学号,专业,系主任,课程,分数)对应的关系,来判断一下它是不是一个好的关系模式,它的约束条件有:
1.一个系有若干学生,但一个学生只属于一个系
2.一个系只能有一名系主任
3.一个学生可以选修多门课程,没门课程有若干学生选修,每个学生所学的每门课程都只能有一个成绩
根据其约束条件,很明显这并不是一个好的关系模式,下面分析它的问题。
(1)例如每当有一门学生选了一个专业和课程,系主任的名字就要存储一次,非常麻烦,如此下去,系主任的名字就会被多次重复存储。这就叫数据冗余。
(2)假设王主任被调走了,那么系主任就要换新名字,那是不是要更新很多数据呢。这就叫更新异常。
(3)假设这个系刚刚成立,学生还没有选课,在这种情况下系的信息就体现不出来。这就叫插入异常。
(4)假设这个系的学生全毕业了,那么我们就要删除这些学生了,学生信息删除了,系还是在的,但删除的话学生的基本信息都要删且没有地方存放学生的基本信息,这就叫删除异常。
为什么会出现这样的问题呢?其实是由于存在于模式中的某些数据依赖引起的,我们的解决方法就是通过分解关系模式来消除其中不合适的数据依赖。
4.2 函数依赖
函数依赖的定义:设R(U)是一个属性集U上的关系模式,X和Y是U的子集,若对于R(U)的任意一个可能关系r,r中不可能存在两个元组在X上的属性值相等,而在Y上的属性值不等,则称“X函数确定Y”或“Y函数依赖于X”,记作。X称为这个函数依赖的决定属性集。
简单来说就是一个特定的X肯定能确定一个特定的Y,例如在学生关系表中,学号唯一,不存在学号相同但姓名不同的情况,我们称学号姓名。
注意:(1)函数依赖是指R的所有关系均要满足的约束条件
(2)函数依赖是语义范畴的概念,例如姓名年龄只有在不允许有同名人的条件下成立,但数据库设计者可以对现实世界作强制的规定。
4.2.1 函数依赖的分类
(1)平凡函数依赖与非平凡函数依赖:在关系模式R(U)中,对于U的子集X和Y
如果XY,但Y⊄X,则称 XY是非平凡的函数依赖
若 XY,但Y⊆ X则称 XY是平凡的函数依赖
例如在关系模式学生(学号、课程、分数)中
非平凡函数依赖:(学号,课程号)成绩
平凡函数依赖:(学号,课程号)课程号
(2)完全函数依赖与部分函数依赖
在关系模式R(U)中,如果 XY,并且对于X的任何一个真子集X',都有Y不依赖于X',则称Y完全函数依赖与X。
若X Y,但Y不完全函数依赖于X,则称Y部分函数依赖于X。
(3)传递函数依赖
在关系模式R(U)中,如果 XY, YZ,且Y⊄X,Y不依赖与X,则称Z传递函数依赖于X
4.2.2 码
在前面的学习中,我们知道了码的概念是:能唯一标识文件中每个记录的字段或字段集。
本节的码的概念也和这个差不多:设K为关系模式R(U,F)中的属性或属性组合,若U完全依赖于K,则K称为R的一个候选码,若关系模式R有多个候选码,则选定其中的一个做为主码。候选码能够唯一地标别关系的元组,是关系模式中一最重要的属性,主码又和外码一起提供了一个表示关系间联系的手段。
4.2.3 Armstrong公理
设A、B、C、D是给定关系模式R的属性集的任意子集,并把A∪B记为AB,则其推理规则可以总结为一下三条:
1、自反律:如果B⊆A,则AB
2、增广律:如果 AB,则ACBC
3、传递率:如果AB且BC,则AC
由Armstrong公理可以得到一下推论:
自合规则:AA
分解规则:如果ABC,则AB且AC
合并规则:如果AB,AC,则ABC
复合规则:如果AB,CD成立,则ACBD
4.2.4 闭包及其计算(理解即可)
4.2.5 最小函数依赖集(理解即可)