侧边栏壁纸
博主头像
BvBeJ的小站 博主等级

行动起来,活在当下

  • 累计撰写 25 篇文章
  • 累计创建 1 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

函数依赖(Functional Dependency, FD)详解

BvBeJ
2025-04-11 / 0 评论 / 0 点赞 / 9 阅读 / 0 字

函数依赖是数据库规范化理论的核心概念,用于描述关系中属性之间的依赖关系,直接影响数据库设计(如范式分解)。以下是系统总结:


1. 定义

  • 函数依赖:若在关系 ( R ) 中,属性集 ( X ) 的值能唯一确定属性集 ( Y ) 的值,则称 ( Y ) 函数依赖于 ( X ),记作 ( X \to Y )。
    • 形式化表述:对 ( R ) 中任意两个元组 ( t_1 ) 和 ( t_2 ),若 ( t_1[X] = t_2[X] ),则必有 ( t_1[Y] = t_2[Y] )。

示例

  • 在学生表 ( R(\underline{学号}, 姓名, 系名) ) 中:
    • ( 学号 \to 姓名 )(学号唯一决定姓名)
    • ( 学号 \to 系名 )(学号唯一决定所属系)

2. 分类

(1) 平凡 vs 非平凡函数依赖

  • 平凡函数依赖:( X \to Y ) 且 ( Y \subseteq X )。
    • 例如:( (学号, 姓名) \to 学号 )(必然成立,无实际意义)。
  • 非平凡函数依赖:( X \to Y ) 且 ( Y \not\subseteq X )。
    • 例如:( 学号 \to 系名 )(有意义,需重点分析)。

(2) 完全 vs 部分函数依赖

  • 完全函数依赖:( X \to Y ),且 ( Y ) 不依赖于 ( X ) 的任何真子集。
    • 例如:( (学号, 课程号) \to 成绩 )(成绩由学号和课程号共同决定,缺一不可)。
  • 部分函数依赖:( X \to Y ),但存在 ( X ) 的真子集 ( X’ ) 使得 ( X’ \to Y )。
    • 例如:( (学号, 课程号) \to 姓名 )(若 ( 学号 \to 姓名 ) 已成立,则姓名部分依赖于复合键)。

(3) 传递函数依赖

  • 若 ( X \to Y )、( Y \to Z ),且 ( Y \not\to X )(( Y ) 不是超码),则称 ( Z ) 传递依赖于 ( X )。
    • 例如:( 学号 \to 系名 )、( 系名 \to 系主任 ),则 ( 学号 \to 系主任 ) 是传递依赖。

3. 函数依赖与键的关系

  • 候选码:若 ( K ) 是关系 ( R ) 的候选码,则 ( K \to R )(即 ( K ) 可决定所有属性)。
  • 主属性:包含在任一候选码中的属性。
  • 非主属性:不包含在任何候选码中的属性。

示例

  • 关系 ( R(\underline{学号}, 姓名, 系名, 系主任) ):
    • 候选码:( {学号} )(假设学号唯一)。
    • 函数依赖:
      • ( 学号 \to 姓名 )
      • ( 学号 \to 系名 )
      • ( 系名 \to 系主任 )(传递依赖)

4. 函数依赖的公理系统(Armstrong公理)

用于推导隐含的函数依赖:

  1. 自反律:若 ( Y \subseteq X ),则 ( X \to Y )。
  2. 增广律:若 ( X \to Y ),则 ( XZ \to YZ )。
  3. 传递律:若 ( X \to Y ) 且 ( Y \to Z ),则 ( X \to Z )。

推论

  • 合并律:若 ( X \to Y ) 且 ( X \to Z ),则 ( X \to YZ )。
  • 分解律:若 ( X \to YZ ),则 ( X \to Y ) 且 ( X \to Z )。

5. 函数依赖的应用

(1) 数据库规范化

  • 1NF:属性不可再分。
  • 2NF:消除非主属性对候选码的部分函数依赖
  • 3NF:消除非主属性对候选码的传递函数依赖
  • BCNF:消除主属性对候选码的传递依赖。

(2) 数据冗余与异常

  • 冗余:部分依赖和传递依赖会导致数据重复存储。
  • 异常:插入、删除、更新时可能引发不一致。

6. 示例分析

关系 ( R(学号, 课程号, 姓名, 系名, 成绩) )

  • 函数依赖
    • ( (学号, 课程号) \to 成绩 )(完全依赖)
    • ( 学号 \to 姓名 )、( 学号 \to 系名 )(部分依赖)
    • ( 系名 \to 系主任 )(传递依赖)
  • 问题
    • 部分依赖导致数据冗余(同一学生的姓名、系名重复存储)。
    • 传递依赖导致更新异常(修改系名需同步所有相关元组)。
  • 解决方案
    • 分解为:
      1. ( R1(\underline{学号}, 姓名, 系名) )
      2. ( R2(\underline{学号}, \underline{课程号}, 成绩) )
      3. ( R3(\underline{系名}, 系主任) )

7. 总结

概念 描述
函数依赖 ( X \to Y ) ( X ) 唯一决定 ( Y )
完全依赖 ( Y ) 依赖于 ( X ) 的全部,而非真子集
部分依赖 ( Y ) 依赖于 ( X ) 的真子集
传递依赖 通过中间属性间接依赖(如 ( X \to Y \to Z ))
候选码 最小属性集,能函数决定所有属性
主码 被选中的候选码

理解函数依赖是设计高效、无冗余数据库的关键,尤其在规范化过程中需逐步消除部分和传递依赖。

0

评论区