数据库规范化中的“函数依赖”是理解和应用规范化过程的关键概念。函数依赖描述了一个或多个列(属性)如何唯一确定另一个列的值。
函数依赖的基本概念:
- 函数依赖:如果在一个给定的关系中,对于某个属性集合 ( A ) 的每个可能的值,都有一个唯一的属性集合 ( B ) 的值与之对应,则说 ( B ) 函数依赖于 ( A )。记作 ( A —>B )。
- 完全函数依赖:如果 ( B ) 函数依赖于一个组合属性 ( A ),并且对于 ( A ) 中的任何一个真子集 ( A’ ),( B ) 都不依赖于 ( A’ ),则称 ( B ) 完全函数依赖于 ( A )。
- 部分函数依赖:如果 ( A ) 是一个组合属性,并且 ( B ) 函数依赖于 ( A ) 中的一个真子集,则称 ( B ) 部分函数依赖于 ( A )。
- 传递依赖:如果存在一个属性集 ( C ),使得 ( B ) 函数依赖于 ( C ),而 ( C ) 又函数依赖于 ( A ),则称 ( B ) 传递依赖于 ( A )。
表格示例 - 学生选课信息表
假设我们有一个表格 StudentCourses,其中包含以下列:
| StudentID | StudentName | CourseID | CourseName | DepartmentID | DepartmentName | 
|---|---|---|---|---|---|
函数依赖分析
- 函数依赖: - StudentID → StudentName:学生ID唯一确定学生姓名。
- CourseID → CourseName:课程ID唯一确定课程名称。
- DepartmentID → DepartmentName:部门ID唯一确定部门名称。
 
- 完全函数依赖: - 假设 (StudentID, CourseID)联合唯一标识每条选课记录,那么我们可以说,学生ID和课程ID的组合完全确定每条选课记录。
 
- 假设 
- 部分函数依赖: - 如果 StudentName只依赖于StudentID而不是(StudentID, CourseID)的整个组合,则存在部分函数依赖。同样,CourseName只依赖于CourseID。
 
- 如果 
- 传递依赖: - 如果 DepartmentID依赖于CourseID,而DepartmentName又依赖于DepartmentID,则DepartmentName对CourseID存在传递依赖。
 
- 如果 
范式
为了解决这些依赖关系带来的问题(如数据冗余和更新异常),我们可以通过规范化过程将这个表分解为几个较小的表:
- 第一范式 (1NF): - 数据表的每一列都是不可分割的基本数据项。
- 同一列中的值都是同一类型。
- 每一列都有唯一的名称。
- 每个单元格的值都是单一的(不包含多个值)。
 
- 第二范式 (2NF): - 已经满足1NF。
- 表中的所有非键属性都完全依赖于主键(消除了部分依赖)。
 
- 第三范式 (3NF): - 已经满足1NF和2NF。
- 表中的所有非键属性不仅完全依赖于主键,而且还是直接依赖于主键(消除了传递依赖)。
 
结果 - 规范化后的表
-  Students Table: StudentID StudentName 
-  Courses Table: CourseID CourseName DepartmentID 
-  Departments Table: DepartmentID DepartmentName 
通过这种方式,我们可以有效地减少数据冗余,减少更新、插入和删除异常,提高数据完整性和查询效率。