函数依赖和传递依赖

58°C 04-01-2025 notbyai
最近更新于:2025-01-04 19:09:40

函数依赖(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. 函数依赖的性质

函数依赖的性质包括以下几个重要规则:

  1. 自反性(Reflexivity)
    • 若 B ⊆ A ,则 A → B 。
  2. 扩展性(Augmentation)
    • 若 A → B ,则 AC → BC (在左右两边同时添加相同的属性)。
  3. 传递性(Transitivity)
    • 若 A → B 且 B → C ,则 A → C 。
  4. 合并性(Union)
    • 若 A → B 且 A → C ,则 A → BC 。
  5. 分解性(Decomposition)
    • 若 A → BC ,则 A → B 且 A → C 。
  6. 伪传递性(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. 传递依赖带来的问题

传递依赖容易导致数据冗余和操作异常:

  1. 冗余问题
    • 同样的信息存储了多次。例如,某部门的经理信息可能在多行数据中重复出现。
  2. 插入异常
    • 如果需要添加一个新部门,但还没有员工,则无法插入,因为必须填入与员工相关的信息。
  3. 删除异常
    • 如果删除最后一个员工记录,则部门和经理的信息也会丢失。
  4. 更新异常
    • 如果某部门经理换人,则需要更新所有相关记录,否则会导致数据不一致。

函数依赖与传递依赖的区别

特点函数依赖传递依赖
定义直接的属性依赖关系间接的属性依赖关系,通过中间属性传递
范围是属性关系的基础概念是函数依赖的一种特殊情况
影响可能会导致数据冗余,但影响较小可能导致更严重的数据冗余和更新异常
解决方法通过分解部分依赖和规范化提高数据库质量通过消除传递依赖(第三范式)优化表结构

如何消除传递依赖?

在关系数据库中,为了消除传递依赖,可以采用规范化的方式,分解关系表到第三范式(3NF)

第三范式(3NF)

  • 定义:一个关系模式在第二范式的基础上,如果不存在非主属性候选键的传递依赖,则属于第三范式。
  • 简单来说:在3NF中,所有非主属性都应该直接依赖于主键,而不是间接依赖。

消除方法:分解关系模式

将传递依赖的关系分解为多个子关系。例如:

  • 关系 R(A, B, C) 中 A → B ,且 B → C ,
  • 可以分解为两张表:
  1. R1(A, B) :存储 A → B 的关系。
  2. R2(B, C) :存储 B → C 的关系。

这样,传递依赖 A → C 被间接表示,避免了冗余。


总结

  • 函数依赖是描述属性间直接关系的基础概念,包括完全依赖和部分依赖等。
  • 传递依赖是函数依赖的扩展,描述属性间的间接关系。
  • 函数依赖和传递依赖可能导致数据冗余和更新异常,但通过规范化(如达到3NF或BCNF)可以优化数据库结构,减少冗余,提升效率和一致性。

评论留言

欢迎您,!您可以在这里畅言您的的观点与见解!

0 条评论