各种函数依赖
假设我们有一个表格存储学生成绩信息:
学生成绩表
学号 (SNo) | 课程号 (CNo) | 分数 (Score) | 姓名 (Name) | 班级 (Class) |
---|
1. 平凡依赖(Trivial Dependency)
平凡依赖指的是属性集中的某个属性依赖于自身。不需要从其他属性获得信息。
例子:
- 在表中,对于任何属性集 {SNo, CNo, Score},平凡依赖有 {SNo} → SNo, {CNo, Score} → Score 等。
2. 非平凡依赖(Non-Trivial Dependency)
非平凡依赖是指如果 X → Y 成立并且 Y 不属于 X,这称为非平凡依赖。
例子:
- 在学生成绩表中,{SNo, CNo} → Score 是一个非平凡依赖,因为分数 Score 不属于组合键 {SNo, CNo}。
3. 完全函数依赖(Full Functional Dependency)
完全函数依赖是指 Y 对 X 是完全依赖的,但对 X 的任何真子集都不依赖,即去掉任何一个 X 的成分,依赖关系不再成立。
例子:
- {SNo, CNo} → Score 是完全函数依赖,因为只有通过学号和课程号的组合才能唯一确定一个分数。
4. 部分函数依赖(Partial Functional Dependency)
部分函数依赖指的是在一个复合主键中,如果有一个非主属性依赖于主键的一部分,而不是整个主键。
假设学生成绩表的主键是由“学号 (SNo)”和“课程号 (CNo)”组合而成,这样能唯一标识一条记录。
然而,“姓名 (Name)”和“班级 (Class)”只依赖于“学号 (SNo)”而非整个主键,因为一个学生会有多个课程。因此,这里有部分函数依赖:
- 名称 (Name) 依赖于 学号 (SNo)
- 班级 (Class) 依赖于 学号 (SNo)
5. 传递函数依赖(Transitive Dependency)
传递函数依赖是指如果存在 X → Y 和 Y → Z,那么就有 X → Z。通常在属性集合中隐含信息传递。
例子:
- 假设我们有一个额外的表记录班级信息,比如班级代表:
班级信息表
| 班级 (Class) | 班长 (Leader) |
|--------------|---------------|
在这种情况下,学生成绩表中的班级对班长存在传递函数依赖:{SNo} → {Class} 和 {Class} → {Leader},因此 {SNo} → {Leader} 是传递依赖。
这些不同类型的依赖关系帮助我们识别数据库设计中的冗余、异常,并指导我们进行范式化处理。