问题的提出
一个关系模式应该是一个五元组:R(U,D,DOM,F)
这里:
关系名R是符号化 的元组语义。
U为一组属性。
D为属性组U中华的属性所来自的域。
DOM为属性到域的映射。
F为属性组U上的一组数据依赖。
由于D、DOM与模式设计关系不大,因此把关系模式看作一个三元组:R< U,F >
当且仅当U上的一个关系r满足F时,r称为关系模式R<U,F>的一个关系。
作为一个二维表,关系要符合一个最基本的条件:每一个分量必须时不可再分的数据项。满足了这个条件的关系模式就属于第一范式。
数据依赖是一种关系内部属性与属性之间的一种约束关系。这种约束关系是通过属性间的值的相等与否与否体现出来的数据间的相关联系。它是现实世界属性间相互联系的抽象,是数据的内在性值,是语义的体现。
人们已经提出了许多种类型的数据依赖,其中最重要的是函数依赖和多值依赖。
【例】建立一个描述学校教务的数据库,该数据库涉及的对象包括学生的学号(Sno)、所在系(Sdept)、系主任名(Mname)、课程号(Cno)和成绩(Grade)。假设用一个单一的关系模式Student来表示,则该关系模式的属性集合为:
U={Sno,Sdept,Mname,Cno,Grade}
现实世界的已知事实(语义)告诉我们:
- 一个系有若干的学生,但一个学生只属于一个系。
- 一个系只有一名负责人
- 一名学生可以选修多名课程,每门课程有若干名学生选修。
- 每个学生学习每一门课程有一个成绩
于是得到属性组U上的一组函数依赖F:
F={Sno->Sdept,Sdept->Mname,(Sno,Cno)->Grade}
如果只考虑函数依赖这一种数据依赖,可以得到一个描述学生的关系模式Student<U,F> ,但是这个关系模式存在以下问题:
- 数据冗余:一个系主任的姓名重复出现
- 更新异常:由于数据冗余,当更新数据库时,系统要付出很大的代价来维护数据库的完整性,否则会面临数据不一致的危险
- 插入异常:如果一个系刚建立,尚无学生,则无法把这个系及其系主任的信息存入数据库。
- 删除异常:如果这个系得学生全部毕业了,则删除该系学生信息的同时,这个系及其系主任的信息也丢掉了。
一个好的关系模式应当不会插入异常、删除异常和更新异常,数据冗余应尽可能少。
规范化
函数依赖
定义:设R(U)是属性集U上的关系模式,X,Y是U的子集。若对于R(U)的任意一个看人能的关系r,r中不可能存在两个元组X上的属性值相等,而在Y上的属性值不相等,则称X函数确定Y或Y函数依赖于X,记作X->Y
注:函数依赖不是指关系模式R中的某个或某些关系满足的约束条件,而是指R的一切关系均要满足的约束条件。
下面介绍一些术语和符号:
- X->Y,但Y⊄X,则称X->Y是非平凡的函数依赖。
- X->Y,但Y⊆X,则称X->Y是平凡的函数依赖。(对于任意的关系模式,平凡的函数依赖是必然成立的)
- 若X->Y,则X称为这个函数依赖的决定属性组,也称为决定因素。
- 若X->Y,Y->X,则记作X<-->Y。
在R(U)中,如果X->Y,并且对于X 的任何一个真子集X‘,都有X’-/->Y,则称Y对X完全函数依赖。若X->Y,但Y不完全依赖于X,则称Y对X部分函数依赖。
在R(U)中,如果X->Y(Y)(Y⊄X),Y-/->X,Y-->Z,Z⊄Y,则称Z对X传递函数依赖。
码
码是关系模式中的一个重要概念。
定义:设K为R<U,F>中的属性的集合,若U对K完全函数依赖,则K为R的候选码。
若候选码多于一个,则选定其中的一个为主码。包含在任何一个候选码中的属性称为主属性;不包含在任何一个候选码中的属性称为非主属性或者非码属性。最简单的情况,单个属性是码;最极端的情况,整个属性组是码,称为全码。
主码或者候选码都简称码。</