函数依赖是数据库规范化理论的核心概念,用于描述关系中属性之间的依赖关系,直接影响数据库设计(如范式分解)。以下是系统总结:
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公理)
用于推导隐含的函数依赖:
- 自反律:若 ( Y \subseteq X ),则 ( X \to Y )。
- 增广律:若 ( X \to Y ),则 ( XZ \to YZ )。
- 传递律:若 ( 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 系主任 )(传递依赖)
- 问题:
- 部分依赖导致数据冗余(同一学生的姓名、系名重复存储)。
- 传递依赖导致更新异常(修改系名需同步所有相关元组)。
- 解决方案:
- 分解为:
- ( R1(\underline{学号}, 姓名, 系名) )
- ( R2(\underline{学号}, \underline{课程号}, 成绩) )
- ( R3(\underline{系名}, 系主任) )
- 分解为:
7. 总结
概念 | 描述 |
---|---|
函数依赖 ( X \to Y ) | ( X ) 唯一决定 ( Y ) |
完全依赖 | ( Y ) 依赖于 ( X ) 的全部,而非真子集 |
部分依赖 | ( Y ) 依赖于 ( X ) 的真子集 |
传递依赖 | 通过中间属性间接依赖(如 ( X \to Y \to Z )) |
候选码 | 最小属性集,能函数决定所有属性 |
主码 | 被选中的候选码 |
理解函数依赖是设计高效、无冗余数据库的关键,尤其在规范化过程中需逐步消除部分和传递依赖。
评论区