函数依赖在数据库设计中是非常关键的概念,用于描述关系数据库中数据项之间的相关性。下面我将通过几个例子来说明函数依赖的几种类型:完全函数依赖、部分函数依赖和传递函数依赖。
完全函数依赖
考虑一个关系模式 Student
,包含属性 StudentID
, CourseID
, Grade
和 Department
。假设每门课程每个学生只能获得一个成绩,并且学生的部门由学生ID唯一确定。
- 关系模式:
Student(StudentID, CourseID, Grade, Department)
- 函数依赖:
StudentID → Department
:学生ID完全决定部门,没有学生ID的其他部分可以决定部门,这是一个完全函数依赖。(StudentID, CourseID) → Grade
:学生ID和课程ID的组合完全决定成绩,单独的学生ID或课程ID不能决定成绩,这也是一个完全函数依赖。
部分函数依赖
现在考虑一个关系模式 Enrollment
,包含属性 StudentID
, CourseID
, Grade
, StudentName
和 CourseName
。假设学生名字和课程名字分别由学生ID和课程ID决定。
- 关系模式:
Enrollment(StudentID, CourseID, Grade, StudentName, CourseName)
- 函数依赖:
StudentID → StudentName
:学生ID决定学生名字,这是完全函数依赖。(StudentID, CourseID) → StudentName
:虽然这个函数依赖在技术上成立,但由于StudentID
单独就可以决定StudentName
,所以StudentName
部分依赖于(StudentID, CourseID)
。
传递函数依赖
最后,考虑一个关系模式 Employee
,包含属性 EmployeeID
, ManagerID
, Department
和 ManagerName
。假设经理的名字由经理的ID决定,而员工的部门由经理的ID间接决定。
- 关系模式:
Employee(EmployeeID, ManagerID, Department, ManagerName)
- 函数依赖:
ManagerID → Department
:经理ID直接决定部门,这是一个直接的函数依赖。ManagerID → ManagerName
:经理ID直接决定经理的名字,这是另一个直接的函数依赖。ManagerID → Department
和ManagerID → ManagerName
导致EmployeeID → Department
通过ManagerID
,这是传递函数依赖,因为Department
不是直接由EmployeeID
决定的,而是通过ManagerID
间接决定的。