国开《数据库基础与应用》第三章 3-4-2:第二范式规范化举例
3-4-2:第二范式规范化举例
设一个学生选课关系为SSC(学生号,姓名,性别,课程号,课程名,课程学分,成绩),其中每个学生可以选修多门课程,每门课程可以由多个学生选修,成绩属性描述某个学生学习某门课程的考试成绩。SSC关系的具体实例下表1所示。
表1 学生选课关系
学生号 | 姓名 | 性别 | 课程号 | 课程名 | 课程学分 | 成绩 |
---|---|---|---|---|---|---|
0101001 | 王明 | 男 | C001 | C++语言 | 4 | 78 |
0101001 | 王明 | 男 | C004 | 操作系统 | 3 | 62 |
0102005 | 刘芹 | 女 | E002 | 电子技术 | 5 | 73 |
0202003 | 张鲁 | 男 | C001 | C++语言 | 4 | 94 |
0202003 | 张鲁 | 男 | X003 | 信号原理 | 4 | 80 |
0202003 | 张鲁 | 男 | C004 | 操作系统 | 3 | 65 |
0303001 | 赵红 | 女 | C001 | C++语言 | 4 | 76 |
0304006 | 刘川 | 男 | E002 | 电子技术 | 5 | 72 |
最小函数依赖集:根据SSC关系模式的语义,也就是上述对SSC关系的解释,可以得出该关系的最小函数依赖集FD为:
FD={学生号→姓名,学生号→性别,课程号→课程名,课程号→课程学分,(学生号,课程号)→成绩}
侯选码:(学生号,课程号)就是该关系的一个候选码,并且是唯一的候选码,同时只能由它作为该关系的主码。
部分依赖:姓名、性别部分依赖于学生号,课程名和课程学分部分依赖于课程号。成绩属性是完全依赖于候选码(学生号,课程号)。
存在着数据冗余。一个学生要选修多门课程,该学生的个人属性信息要重复存储多次。一门课程可以被多个学生选修,该课程的属性信息也得被存储多次。
存在着插入异常。当一个学生不选修课程时就无法被插入,而不选修课程应该是允许的;或者一门课在无人选修之前也无法被插入。
存在着删除异常。进行删除时,若一个学生选课的所有元组被删除了,则该学生的信息也就不存在了,或者同选一门课的所有学生选课元组都删除了,该课程的信息也就不存在了。
存在着修改异常:进行修改操作时,若一门课程的学分改变了,就需要修改它对应的所有选课元组中的课程学分属性的值,若遗漏一处就造成数据存储的不一致。
消除部分依赖方法:要分解上面的学生选课关系SSC,使直接依赖学生号的属性子集成为一个单独关系S,使直接依赖课程号的属性子集成为另一个单独关系C,使学生号、课程号和成绩这3个属性所构成的属性子集单独成为一个关系SC。分解后的三个关系为
S=(学生号,姓名,性别) //学生号为S关系的主码
C=(课程号,课程名,课程学分) //课程号为C关系的主码
SC=(学生号,课程号,成绩) //(学生号,课程号)为SC关系的主码
它们对应的最小函数依赖集分别为:
FD1={学生号→姓名,学生号→性别}
FD2={课程号→课程名,课程号→课程学分}
FD3={(学生号,课程号)→成绩}
在消除部分依赖的同时,也由一个SSC关系,变为了S、C和SC这3个关系。将这3个关系按照学生号和课程号进行自然连接,连接表达式为:S∞SC∞C,得到的结果关系与原关系SSC是完全相同的。
关系投影:把学生选课关系模式SSC分解成学生关系模式S、课程关系模式C和选课关系模式SC后,再对上表所示的SSC关系实例按分解模式进行关系投影将得到的关系实例分别如下表2、表3和表4所示。
表2 学生关系
学生号 | 姓名 | 性别 |
---|---|---|
0101001 | 王明 | 男 |
0102005 | 刘芹 | 女 |
0202003 | 张鲁 | 男 |
0303001 | 赵红 | 女 |
0304006 | 刘川 | 男 |
表3 课程关系
课程号 | 课程名 | 课程学分 |
---|---|---|
C001 | C++语言 | 4 |
C004 | 操作系统 | 3 |
E002 | 电子技术 | 5 |
X003 | 信号原理 | 4 |
表4 选课关系
学生号 | 课程号 | 成绩 |
---|---|---|
0101001 | C001 | 78 |
0101001 | C004 | 62 |
0102005 | E002 | 73 |
0202003 | C001 | 94 |
0202003 | X003 | 80 |
0202003 | C004 | 65 |
0303001 | C001 | 76 |
0304006 | E002 | 72 |
取消部分依赖后的好处:减少了数据冗余,消除了操作异常,使得每个学生的信息、每门课程的信息只在相应的关系中保存一个版本,每个学生、每门课程、每次选课的有关信息都能够分别独立地被插入、删除或修改,当查询需要时,也很方便进行相关连接。