假定有如下关系SCD:
SCD(Sno,Sname,Ssex,Sdept,Sdean,Cno,Cname,Grade)
其中,SCD表示学生关系,对应的各属性依次为学号、姓名、性别、院系、系主任、课程号、课程名称和成绩。关系的主码为(Sno,Cno)。
这个关系模式存在如下问题。
1.数据冗余
当一个学生选修多门课程就会出现数据冗余。假如某个学生(“2010050101”,“丁天波”,“男”,“管理学院”,“张胜”)共选了20门课程,则该学生的学号、姓名、性别、院系、系主任信息要重复存储20次,如果全校有一万名学生都要选修多门课程,则这样的冗余就会造成大量的空间上的浪费。同时,同一门课程如果有多名学生选修,课程名称要重复存储多次,这样进一步增加了存储空间的开销。
2.更新异常
由于存在大量的数据冗余,当更新数据库中的数据时,系统要付出很大的代价来维护数据库的完整性。否则会面临数据不一致性的危险。例如,某院系要换系主任,或某门课程要修改名字,必须要修改每一个相关的元组,如果一部分修改了,而另外一部分未修改,则造成了数据的不一致性。
3.插入异常
如果刚开出一门课程,但是这样的课程还没有学生选修,则无法把课程信息插入到该数据库中;如果一个学生刚刚入学,还没有选修任何课程,则这样的学生无法插入到该数据库中;如果一个院系刚刚成立,还没有招收任何学生,则这个院系信息也无法添加到数据库中。
4.删除异常
如果选修某门课程的学生都毕业了,在删除学生信息时,则相关的课程信息业会跟着被删除。
鉴于以上种种问题,可以得出结论:设计的该关系模式SCD并不是一个好的关系模式。一个好的关系模式应该不会发生插入异常、删除异常和更新异常,数据冗余也会降到最小。
一个关系模式之所以会产生上述问题,是由于关系模式中存在着不良的函数依赖关系引起的。