一、问题提出
一个关系模式应当是一个五元组。
R(U, D, DOM, F)
这里:
- 关系名R是符号化的元组语义。
- U为一组属性。
- D为属性组U中的属性所来自的域。
- DOM为属性到域的映射。
- F为属性组U上的一组数据依赖。
由于D、DOM与模式设计关系不大,因此在本章中把关系模式看作一个三元组:
R<U,F>
当且仅当U上的一个关系r满足F时,r称为关系模式 R<U,F>的一个关系。
作为一个二维表,关系要符合一个最基本的条件:每一个分量必须是不可分的数据项满足了这个条件的关系模式就属于第一范式(1NF)。
数据依赖是一个关系内部属性与属性之间的一种约束关系。这种约束关系是通过属性间值的相等与否体现出来的数据间相关联系。它是现实世界属性间相互联系的抽象,是数据内在的性质,是语义的体现。
人们已经提出了许多种类型的数据依赖,其中最重要的是函数依赖(Functional Dependency,FD)和多值依赖(Multi-Valued Dependency,MVD)。
函数依赖极为普遍地存在于现实生活中。比如描述一个学生的关系,可以有学号(Sno)、姓名(Sname)、系名(Sdept)等几个属性。由于一个学号只对应一个学生,一个学生只在一个系学习。因而当“学号”值确定之后,学生的姓名及所在系的值也就被唯一地确定了。属性间的这种依赖关系类似于数学中的函数y-f(x),自变量x确定之后,相应的函数值y也就唯一地确定了。
类似的有Sname-=f(Sno),Sdept-f(Sno),即Sno函数决定Sname,Sno函数决定Sdept或者说 Sname 和Sdept 函数依赖于Sno,记作Sno→Sname,Sno→Sdept。
[例6.1]建立一个描述学校教务的数据库,该数据库涉及的对象包括学生的学号(Sno)、所在系(Sdept)、系主任姓名(Mname)、课程号(Cno)和成绩(Grade)。假设用一个单一的关系模式Student来表示,则该关系模式的属性集合为
U= {Sno, Sdept, Mname, Cno, Grade)现实世界的已知事实(语义)告诉我们:
①一个系有若干学生,但一个学生只属于一个系。
②一个系只有一名(正职)负责人。
③一个学生可以选修多门课程,每门课程有若干学生选修。
④每个学生学习每一门课程有一个成绩。
于是得到属性组U上的一组函数依赖F(如图6.1所示)。
F={Sno→Sdept, Sdept→Mname, (Sno, Cno)→-Grade)
但是,这个关系模式存在以下问题:
(1)数据冗余
比如,每一个系的系主任姓名重复出现,重复次数与该系所有学生的所有课程成绩出
现次数相同,如表6.1所示。这将浪费大量的存储空间。
(2)更新异常(update anomalies)
由于数据冗余,当更新数据库中的数据时,系统要付出很大的代价来维护数据库的完整性,否则会面临数据不一致的危险。比如,某系更换系主任后,必须修改与该系学生有关的每一个元组。
(3) 插入异常(insertion anomalies)
如果一个系刚成立,尚无学生,则无法把这个系及其系主任的信息存入数据库。
(4) 删除异常(deletion anomalies)