先决条件:函数依赖和属性闭包
函数依赖是一种约束,它指定两组属性之间的关系,其中一组可以准确地确定其他组的值。它表示为X → Y ,其中 X 是一组能够确定 Y 值的属性。 在箭头左侧设置的属性, X称为行列式,而在右侧, Y称为依赖者。函数依赖用于以数学方式表达数据库实体之间的关系,对于理解关系数据库系统中的高级概念和理解 Gate 等竞争性考试中的问题非常重要。
例子:
roll_no | name | dept_name | dept_building |
---|---|---|---|
42 | abc | CO | A4 |
43 | pqr | IT | A3the |
44 | xyz | CO | A4 |
45 | xyz | IT | A3 |
46 | mno | EC | B2 |
47 | jkl | ME | B2 |
从上表我们可以得出一些有效的函数依赖关系:
- roll_no → { name, dept_name, dept_building },→ 这里,roll_no 可以确定字段 name、dept_name 和 dept_building 的值,因此是一个有效的函数依赖
- roll_no → dept_name ,因为 roll_no 可以确定整个 {name, dept_name, dept_building} 的集合,所以它也可以确定它的子集 dept_name。
- dept_name → dept_building , Dept_name 可以准确识别dept_building,因为dept_name不同的部门也会有不同的dept_building
- 更有效的函数依赖:roll_no → name, {roll_no, name} ⇢ {dept_name, dept_building} 等。
以下是一些无效的函数依赖项:
- name → dept_name 同名学生可以有不同的dept_name,因此这不是有效的函数依赖。
- dept_building → dept_name 同一栋楼里可以有多个部门,比如上表中ME和EC部门在同一栋楼B2,因此dept_building→dept_name是一个无效的函数依赖。
- 更多无效的函数依赖:name → roll_no, {name, dept_name} → roll_no, dept_building → roll_no 等。
阿姆斯壮的函数依赖公理/性质:
- 自反性:如果 Y 是 X 的子集,则 X→Y 由自反性规则成立
例如,{roll_no, name} → name 有效。 - 增强:如果 X → Y 是一个有效的依赖关系,那么 XZ → YZ 对增强规则也是有效的。
例如,如果 {roll_no, name} → dept_building 是有效的,因此 {roll_no, name, dept_name} → {dept_building, dept_name} 也是有效的。→ - 传递性:如果 X → Y 和 Y → Z 都是有效的依赖关系,那么根据传递性规则,X→Z 也是有效的。
比如roll_no→dept_name&dept_name→dept_building,那么roll_no→dept_building也是有效的。
DBMS 中函数依赖的类型:
- 平凡的函数依赖
- 非平凡的函数依赖
- 多值函数依赖
- 传递函数依赖
1.平凡的函数依赖
在Trivial Functional Dependency 中,依赖项始终是行列式的子集。
即如果X → Y并且Y 是 X 的子集,那么它被称为平凡函数依赖
例如,
roll_no | name | age |
---|---|---|
42 | abc | 17 |
43 | pqr | 18 |
44 | xyz | 18 |
这里, {roll_no, name} → name是一个平凡的函数依赖,因为依赖名称是行列式集合{roll_no, name} 的子集
同样, roll_no → roll_no也是一个平凡函数依赖的例子。
2.非平凡的函数依赖
在非平凡的函数依赖中,被依赖者严格地不是行列式的子集。
即如果X → Y并且Y不是 X 的子集,那么它被称为非平凡函数依赖。
例如,
roll_no | name | age |
---|---|---|
42 | abc | 17 |
43 | pqr | 18 |
44 | xyz | 18 |
这里, roll_no → name是一个非平凡的函数依赖,因为依赖名称不是行列式roll_no的子集
类似地, {roll_no, name} → age也是一个非平凡的函数依赖,因为age不是 {roll_no, name} 的子集
3.多值函数依赖
在多值函数依赖中,依赖集合的实体不相互依赖。
即如果a → {b, c}且b 和 c之间不存在函数依赖,则称为多值函数依赖。
例如,
roll_no | name | agethe |
---|---|---|
42 | abc | 17the |
43 | pqr | 18 |
44 | xyz | 18 |
45 | abc | 19 |
这里, roll_no → {name, age}是一个多值函数依赖,因为依赖的名字和年龄不相互依赖(即名字 → 年龄或年龄 → 名字不存在! )
4. 传递函数依赖
在传递函数依赖中,依赖是间接依赖于行列式。
即如果a → b & b → c ,那么根据传递性公理, a → c 。这是一个传递函数依赖
例如,
enrol_no | name | dept | building_no |
---|---|---|---|
42 | abc | CO | 4 |
43 | pqr | EC | 2 |
44 | xyz | IT | 1 |
45 | abc | EC | 2 |
在这里, enrol_no → dept和dept → building_no ,
因此,根据传递性公理, enrol_no → building_no是一个有效的函数依赖。这是一种间接的函数依赖,因此称为传递函数依赖。