为了解决关系模式设计的规范化问题,需要引入一个重要概念: 函数依赖 ( functional dependency ) 函数依赖 反映了一个关系中属性或者属性组之间相互依存、相互制约的关系,即两个列或者列组之间的约束。基于函数依赖理论,可以将一个关系分解为几个更小的关系,使之满足规范化程度更高的关系表。 函数依赖 是关系中属性之间在语义上的关联特性。例如,假设一个关系表的 A 列是国家, B 列是首都,那么如果两条记录的 A 列值是一样的,那么必然它们 B 列的值也是一样的,即国家决定了首都。
在关系模式设计上最重要的约束是函数依赖,它反映了一个关系表中 列或者列组之间相互依存、相互制约 的关系,即两个列或者列组之间的约束。
【例****6.1】描述一个学生Student关系,可以有学号、姓名、系名等属性。一个学号只对应一个学生,一个学生只在一个系中学习,"学号"值确定后,学生的姓名及所在系的值就被唯一确定。
有如下依赖关系, Sname =f( Sno ) , Sdept =f( Sno )
即 Sno 函数决定 Sname
Sno 函数决定 Sdept
记作 Sno → Sname , Sno → Sdept
函数依赖定义
l 对一关系R(U) , X 和 Y 是其列集合 U 的子集, t 和 l 分别是 R 中的任意两个元组。
l 如果t[X]=l[X] ,则t[Y]=l[Y], 那么称 Y 函数依赖于 X ,或者 X 函数决定 Y , 记为 X → Y 。
l 如果 Y 不依赖于 X ,则记为X↛Y 。如果X→Y 且Y→X ,则 X 与 Y 一一对应,记 为X⟷Y 。
一个函数依赖要成立,不但要求关系 R 中当前的值都能满足函数依赖条件,而且还要求关系中的 任一可能取值都满足函数依赖的条件 。此外,函数依赖还具有数据语义特征,即函数依赖在某种程度上也是现实世界的反映。
第一范式 ( 1NF )是指关系 R 的每一属性都是不可再分的基本数据项,同一属性中不能有多个值,即关系表中的某个属性不能有多个值或者不能有重复的属性。
在关系数据库中,满足最低要求的范式是第一范式 ,不满足第一范式的不是关系数据库。如果出现重复的属性,则根据第一范式,需要将该属性进行细分。 第二范式 ( 2NF ) 是指关系 R 首先要满足第一范式,并且每一个 非主属性都完全函数依赖于任何一个候选 键 。
【例】考虑下图的学生-选课-住址关系SLC,其复合主键是{Sno, Cno},Sloc为学生的宿舍楼号,并且每个系的学生住在同一个地方。SLC关系存在如下函数依赖:
学生宿舍地址Sloc和系别Sdept只依赖于复合键中Sno,++存在部分函数依赖++ 。
【**例-**续】由此,我们将关系模式SLC分解成两个满足2NF的关系模式,以消除上述的异常。
第三范式(3NF)是指在关系R 满足第一范式,并且不存在非主属性对候选键的传递函数依赖
**【**例】考虑下图所示的SL关系表,该关系满足第二范式,但存在如下函数依赖:
【**例-**续】将关系模式SL分解成两个关系SL和DL以消除传递函数依赖,使之满足第三范式。
4.3数据依赖的公理系统
Armstrong公理系统
l 用于推导关系数据库中的函数依赖和其他数据依赖
l 提供了一种形式化的方法来理解和处理数据依赖关系,从而提高数据库的可靠性、一致性和性能。
l 一套推理规则,是模式分解算法的理论基础
l 可以用于求给定关系模式的键
l 从一组函数依赖求得蕴涵的函数依赖 闭包及其计算 函数依赖集的等价和最小函数依赖集