函数依赖(Functional Dependency)
1. 定义
在关系模式 R(A, B, C, …) 中,如果对于任意两个元组 t1 和 t2 :
- 若 t1[A] = t2[A] ,则 t1[B] = t2[B] ,
即属性 A 的值可以唯一确定属性 B 的值,则称 B 函数依赖于 A ,记作:
A → B
函数依赖描述了关系中属性之间的确定性约束。
2. 关键概念
2.1 完全函数依赖
- 定义:若 A → B ,并且 A 的任何真子集都不能决定 B ,则称 B 完全函数依赖于 A 。
- 例子:
- (ID, Course) → Grade :学生的学号和课程共同决定成绩。如果去掉其中一个属性(如只用 ID 或 Course),则无法唯一确定成绩。
2.2 部分函数依赖
- 定义:若 A → B ,但 A 的某个真子集也可以决定 B ,则称 B 部分函数依赖于 A 。
- 例子:
- (ID, Course) → Name ,但 ID → Name :说明学生的学号单独就能决定学生的名字,这种依赖是不完全的。
2.3 多值依赖
- 定义:在某些关系中,一个属性组不仅能决定另一个属性的唯一值,还能决定其多个可能的值。这种依赖超出了函数依赖的范围。
- 例子:
- 一个演员可以出演多部电影,演员和电影之间存在多值依赖。
3. 函数依赖的性质
函数依赖的性质包括以下几个重要规则:
- 自反性(Reflexivity)
- 若 B ⊆ A ,则 A → B 。
- 扩展性(Augmentation)
- 若 A → B ,则 AC → BC (在左右两边同时添加相同的属性)。
- 传递性(Transitivity)
- 若 A → B 且 B → C ,则 A → C 。
- 合并性(Union)
- 若 A → B 且 A → C ,则 A → BC 。
- 分解性(Decomposition)
- 若 A → BC ,则 A → B 且 A → C 。
- 伪传递性(Pseudo-Transitivity)
- 若 A → B 且 BC → D ,则 AC → D 。
4. 函数依赖的示例
关系模式 Student(ID, Name, Major, Department, GPA) ,可能有以下依赖关系:
- ID → Name :学号唯一决定学生的姓名。
- ID → Major :学号唯一决定学生的专业。
- Major → Department :专业唯一决定所属的学院。
传递依赖(Transitive Dependency)
1. 定义
传递依赖是函数依赖的一个特殊形式。对于关系模式 R(A, B, C, …) :
- 若 A → B 且 B → C ,
- 则存在 A → C 。
在这个过程中,属性 B 是一个中间属性,导致 C 间接依赖于 A 。这种间接依赖被称为传递依赖。
2. 传递依赖的示例
例 1:
考虑一个关系模式 Employee(ID, Department, Manager) :
- ID → Department :员工的 ID 唯一决定其部门。
- Department → Manager :部门唯一决定部门经理。
- 因此, ID → Manager :员工的 ID 通过部门间接决定经理,这是一个传递依赖。
例 2:
关系模式 Student(ID, Major, Department, Head) ,可能有以下依赖:
- ID → Major :学生的学号唯一决定专业。
- Major → Department :专业唯一决定学院。
- Department → Head :学院唯一决定院长。
- 因此, ID → Head :学号通过专业和学院间接决定院长。
3. 传递依赖带来的问题
传递依赖容易导致数据冗余和操作异常:
- 冗余问题
- 同样的信息存储了多次。例如,某部门的经理信息可能在多行数据中重复出现。
- 插入异常
- 如果需要添加一个新部门,但还没有员工,则无法插入,因为必须填入与员工相关的信息。
- 删除异常
- 如果删除最后一个员工记录,则部门和经理的信息也会丢失。
- 更新异常
- 如果某部门经理换人,则需要更新所有相关记录,否则会导致数据不一致。
函数依赖与传递依赖的区别
特点 | 函数依赖 | 传递依赖 |
---|---|---|
定义 | 直接的属性依赖关系 | 间接的属性依赖关系,通过中间属性传递 |
范围 | 是属性关系的基础概念 | 是函数依赖的一种特殊情况 |
影响 | 可能会导致数据冗余,但影响较小 | 可能导致更严重的数据冗余和更新异常 |
解决方法 | 通过分解部分依赖和规范化提高数据库质量 | 通过消除传递依赖(第三范式)优化表结构 |
如何消除传递依赖?
在关系数据库中,为了消除传递依赖,可以采用规范化的方式,分解关系表到第三范式(3NF)。
第三范式(3NF)
- 定义:一个关系模式在第二范式的基础上,如果不存在非主属性对候选键的传递依赖,则属于第三范式。
- 简单来说:在3NF中,所有非主属性都应该直接依赖于主键,而不是间接依赖。
消除方法:分解关系模式
将传递依赖的关系分解为多个子关系。例如:
- 关系 R(A, B, C) 中 A → B ,且 B → C ,
- 可以分解为两张表:
- R1(A, B) :存储 A → B 的关系。
- R2(B, C) :存储 B → C 的关系。
这样,传递依赖 A → C 被间接表示,避免了冗余。
总结
- 函数依赖是描述属性间直接关系的基础概念,包括完全依赖和部分依赖等。
- 传递依赖是函数依赖的扩展,描述属性间的间接关系。
- 函数依赖和传递依赖可能导致数据冗余和更新异常,但通过规范化(如达到3NF或BCNF)可以优化数据库结构,减少冗余,提升效率和一致性。
评论留言
欢迎您,!您可以在这里畅言您的的观点与见解!
0 条评论