4.1.1 问题的提出

4.1.1 问题的提出

从前面的章节可知,关系是一张二维表,它是涉及属性的笛卡尔积的一个子集。从笛卡尔积中选取哪些元组构成该关系,通常是由现实世界赋予该关系的元组语义来确定的。元组语义实质上是一个n目谓词(n是属性集中属性的个数),使该n目谓词为真的笛卡尔积中的元素(或者说凡符合元组语义的元素)的全体就构成了该关系。

但由上述关系所组成的数据库还存在某些问题。为了便于说明,先看一个实例。

【例4.1】 设有一个关于教学的关系模式R(U),其中U是由属性Sno、Sname、Ssex、Dname、Cname、Tname、Grade组成的属性集合,其中Sno的含义为学生学号,Sname为学生姓名,Ssex为学生性别,Dname为学生所在系别,Cname为学生所选的课程名称,Tname为任课教师姓名,Grade为学生选修该门课程的成绩。若将这些信息设计成一个关系,则关系模式为:

教学(Sno,Sname,Ssex,Dname,Cname,Tname,Grade)

选定此关系的主码为(Sno,Cname)。

由该关系的部分数据(表4-1),不难看出,该关系存在着如下问题:

表4-1 教学关系部分数据

(1)数据冗余

①每一个系名对该系的学生人数乘以每个学生选修的课程门数需要重复存储。

②每一个课程名均对选修该门课程的学生需要重复存储。

③每一个教师都对其所教的学生需要重复存储。

(2)更新异常

由于存在数据冗余,就可能导致数据更新异常,这主要表现在以下几个方面:

①插入异常:由于主码中元素的属性值不能取空值,如果新分配来一位教师或新成立一个系,则这位教师及新系名就无法插入;如果一位教师所开的课程无人选修或一门课程列入计划但目前不开课,也无法插入。

②修改异常:如果更改一门课程的任课教师,则需要修改多个元组。如果仅部分修改,部分不修改,就会造成数据的不一致性。同样的情形,如果一个学生转系,则对应此学生的所有元组都必须修改,否则,也出现数据的不一致性。

③删除异常:如果某系的所有学生全部毕业,又没有在读及新生,当从表中删除毕业学生的选课信息时,则连同此系的信息将全部丢失。同样地,如果所有学生都退选一门课程,则该课程的相关信息也同样丢失了。

由此可知,上述的教学关系尽管看起来能满足一定的需求,但存在的问题太多,从而它并不是一个合理的关系模式。