关系模型的规范化是指面对一个现实问题,如何选择一个比较好的关系模式集合。
当一个关系模式设计的不够规范时,就会出现插入异常、删除异常、冗余过多等问题。例如图10-26学生选课表中,其中编号、姓名属性是表的主键,在实际应用中,该表会存在插入、删除、冗余过多等异常。
图10-26 学生选课表
(1)插入异常。比如一个刚刚成立的系,但尚未招收学生,则因属性编号、姓名为空,导致系名、系主任等信息无法存入数据库;同样,没被学生选修的课程也无法存入数据库。
(2)删除异常。如一个系的学生毕业了,删除学生记录时会将系主任、系名等信息一起删除。
(3)冗余过多。如一个系的系名、系主任姓名都有与该系学生每门课的成绩出现的次数一样多。既浪费存储空间又要付出很大的代价来维护数据库的完整性。当系主任更换后,必须逐一修改该系学生选修课程的每一个元组。
从上面的例子可以看出,一个好的关系模式不应当发生插入异常和删除异常,且数据冗余尽可能地少。引起数据冗余及其操作异常的原因在于关系的结构。现实世界中的许多事物都可以独立存在、独立地被标识、相互间又密切关联。如果将多个本该是独立存在地、具有不同标识的事物用一个关系描述,那么不可能找到这样一个属性集,它既是这个关系的标识,又是包含在其中的各个不同事物的标识,正是由于关系模式的属性之间存在过多的数据依赖,从而出现了数据冗余和更新的异常。(www.xing528.com)
数据依赖是指关系中属性值之间的相互联系,它是现实世界属性间相互联系的体现,是数据之间的内在联系,是语义的体现。现在人们已经提出了许多种类型的数据依赖,其中最重要的是函数依赖。
函数依赖比较容易理解,且普遍地存在于现实生活中。在学生选课表中,因一个编号仅对应一个学生,一个学生只在一个系注册学习。因而,当编号的值确定后,姓名和所在系的值也就唯一确定了。当关系模式属性间存在这个关系时,我们就说姓名和所在系的值依赖于学号,即编号决定姓名和系名。
在学生选课表中除了姓名和系名依赖编号外,还存在其他数据依赖,如一个系只有一个系主任,因此系名依赖于系主任;再如,每个学生学习一门课都有一个成绩,因此成绩依赖于学号和课程名称。因为学生选课表中数据依赖过多,导致发生更新异常和数据冗余问题。
解决办法是将关系模式分解成若干只有单一数据依赖的关系模式,因为关系模式学生选课表出现异常问题是由于属性之间存在过多的数据依赖造成的,分解的目的就是减少属性间过多的数据依赖,已期消除关系模式中出现的异常。学生选课表关系模式分解成如图10-27所示的三个表。
图10-27 规范化后的三个关系表
学生选课表规范化后,分解为学生表、成绩表、系表三个表,解决了关系模式多数据依赖的问题,每个表都是单一的数据依赖。规范化后虽然解决了数据冗余、更新异常的问题,但检索效率明显降低了,需要多表查询。因此,一个关系是否要进行规范化,应当本着具体问题具体分析的原则进行处理。事实上,如果在一个关系上主要执行的是查询操作,未必一定要规范化,通过适当地增加一些关系或者在应用程序中注意到更新一致性的维护,非规范化的弊端是可以避免的。但是,如果在关系上要进行频繁的更新操作,还是要采用规范化的方式比较好。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。