6.1关系模式与数据依赖
关系模式
-
关系模式由五部分组成:
R (U,D,DOM,F)
-
R:关系名
-
U:组成该关系的属性名集合
-
D:属性组U中属性所来自的域
-
DOM:属性向域的映像集合
-
F:属性间的数据依赖关系集合
-
-
关系模式简化表示为三元组
R(U,F)
数据依赖
- 数据依赖的类型
- 函数依赖FD(Functional Dependency):
X->Y
- 多值依赖MVD(Multivalued Dependency):
X->->Y
- 函数依赖FD(Functional Dependency):
数据依赖对关系模式的影响
- 数据冗余太大:浪费大量的存储空间(例如每一个系主任的姓名重复出现)
- 更新异常
- 插入异常
- 删除异常
解决方法:通过分解关系模式来消除其中不合适的数据依赖
6.2规范化
6.2.1函数依赖
定义:对于R(U)的任意一个可能的关系r,r中不可能存在两个元组在X上的属性值相等,而在Y上的属性值不等,则称"X函数确定Y"或“Y函数依赖于X”,记作 X->Y
X称为这个函数依赖的决定属性集,Y = f(x)
- 函数依赖指R中所有的关系实例都满足的约束条件
- 函数依赖是语义范畴的概念,只能根据数据的语义来确定函数依赖(不能根据元组的值确定)
- 数据库设计者可以对现实世界作强制的规定
平凡函数依赖与非平凡函数依赖
- 平凡函数依赖:
X->Y 且 X包含Y
(左侧至少两个属性) - 非平凡函数依赖:
X->Y 且 X不包含Y
(左侧只有一个属性的函数依赖必然为非平凡函数依赖)
平凡函数依赖:(Sno,Cno)->Sno,(Sno,Cno)->Cno
非平凡函数依赖:(Sno,Cno)->Grade
完全函数依赖与部分函数依赖
如果X->Y
,且对于X的任何一个真子集X’,X'->Y
不成立,则称Y完全函数依赖于X,记作X->Y(f);
反之,则为部分函数依赖,记作X->Y§
传递函数依赖
若X->Y, Y->Z, 且X不包含Y, Y->X不成立
,则称Z传递函数依赖于X
若X->Y, Y->Z, 且X不包含Y, Y->X成立
,则称Z直接依赖于X
闭包与最小覆盖
闭包:A的闭包是由A能推出的所有属性的集合
最小覆盖:最小覆盖不唯一
最小覆盖的求法:
- 用分解的法则,使F中的任何一个函数依赖的右部仅含有一个属性;
- 去掉各依赖左部多余的属性:对每一个X->A,对X中的每一个属性B,计算去除B之后的X在G中的闭包,如果闭包包含A,那么就用去除B之后的X替换之前的X(注意此步实际上是两个for循环,而且此步仅需针对属性个数大于1的X就行了);
- 去掉多余的函数依赖:从第一个函数依赖X→Y开始将其从F中去掉,然后在剩下的函数依赖中求X的闭包X+,看X+是否包含Y,若是,则去掉X→Y;否则不能去掉,依次做下去。直到找不到冗余的函数依赖;
6.2.2码
候选码:每一个这样的完全函数依赖K->U(f)
,对应一个候选码
主码:多个候选码中选定一个作为主码
外码:R中的属性或属性组X并非R的码,但X是另一个关系模式的码,称X是R的外码
6.2.3范式
1NF:每个属性都是不可再分的基本数据项
2NF:1NF+每个非主属性都完全依赖于R的码
3NF:2NF+每个非主属性都不传递依赖于候选码
BCNF:每个属性只能函数依赖于候选码
多值依赖:与函数依赖不同,是一对多的描述
4NF:每个非平凡多值依赖都是依赖于候选码的
6.2.4 无损连接与依赖保持
分解关系模式的两个评判标准:
无损连接:子表连接之后不存在内容丢失
判定算法:
1.找出两个子关系的属性组的交和差
2.判定U1∩U2→U1-U2 ∈F+ || U1∩U2→U2 -U1∈F+(成立即为无损连接)
详细解释:即判定公共属性能否唯一决定差集,若能,则说明原来的元组不会丢失
快速判定的充分条件:公共属性是候选码的子集,一定是无损连接
保持函数依赖:由两个子表的函数依赖能推导出原表的所有函数依赖
快速判定的充分条件:主表中某个函数依赖的两端的属性分布在两个子表中