4.1.2 解决的方法

4.1.2 解决的方法

不合理的关系模式最突出的问题是数据冗余,而数据冗余的产生有着较为复杂的原因。如例4.1所示,同一关系模式中各个属性之间存在着某种联系,如学生与系、课程与教师之间存在依赖关系的事实,才使得数据出现大量冗余,引发各种操作异常。这种依赖关系称为数据依赖(Data Independence)。

关系系统当中数据冗余产生的重要原因就在于对数据依赖的处理,从而影响到关系模式本身的结构设计。解决数据间的依赖关系常常采用对关系的分解来消除不合理的部分,以减少数据冗余。在例4.1中,将教学关系分解为3个关系模式来表达:学生基本信息(Sno,Sname,Ssex,Dname),课程信息(Cno,Cname,Tname)及学生成绩(Sno,Cno,Grade),其中Cno为学生选修的课程编号;分解后的部分数据见表4-2、表4-3与表4-4。

表4-2 学生信息

表4-3 课程信息

表4-4 学生成绩表

对教学关系进行分解后,再来考察一下:

(1)数据存储量减少

设有n个学生,每个学生平均选修m门课程,则表4-1中学生信息就有n×m之多。经过改进后学生信息及成绩表中,学生的信息仅为n。学生信息的存储量减少了(m-1)×n。显然,学生选课数绝不会是1,因而,经过分解后数据量要少得多。

(2)更新方便

①插入问题部分解决:对一位教师所开的无人选修的课程可方便地在课程信息表中插入。但是,新分配来的教师、新成立的系或列入计划目前不开课的课程,还是无法插入。要解决无法插入的问题,还可继续将系名与课程作分解来解决。

②修改方便:原关系中对数据修改所造成的数据不一致性,在分解后得到了很好的解决,改进后,只需要修改一处。

③删除问题也部分解决:当所有学生都退选一门课程时,删除退选的课程不会丢失该门课程的信息。值得注意的是,系的信息丢失问题依然存在,解决的方法还需继续进行分解。

虽然改进后的模式部分地解决了不合理的关系模式所带来的问题,但同时,改进后的关系模式也会带来新的问题,如当查询某个系的学生成绩时,就需要将两个关系连接后进行查询,增加了查询时关系的连接开销,而关系的连接代价却又是很大的。

此外,必须说明的是,不是任何分解都是有效的。有时候分解不但解决不了实际问题,反而会带来更多的问题。

那么,什么样的关系模式需要分解?分解关系模式的理论依据又是什么?分解后能完全消除上述的问题吗?回答这些问题需要理论的指导。下面几节将加以讨论。