📜  DBMS 中函数依赖的类型

📅  最后修改于: 2021-09-27 14:32:28             🧑  作者: Mango

先决条件:函数依赖和属性闭包

函数依赖是一种约束,它指定两组属性之间的关系,其中一组可以准确地确定其他组的值。它表示为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 等。

阿姆斯壮的函数依赖公理/性质:

  1. 自反性:如果 Y 是 X 的子集,则 X→Y 由自反性规则成立
    例如,{roll_no, name} → name 有效。
  2. 增强:如果 X → Y 是一个有效的依赖关系,那么 XZ → YZ 对增强规则也是有效的。
    例如,如果 {roll_no, name} → dept_building 是有效的,因此 {roll_no, name, dept_name} → {dept_building, dept_name} 也是有效的。→
  3. 传递性:如果 X → Y 和 Y → Z 都是有效的依赖关系,那么根据传递性规则,X→Z 也是有效的。
    比如roll_no→dept_name&dept_name→dept_building,那么roll_no→dept_building也是有效的。

DBMS 中函数依赖的类型:

  1. 平凡的函数依赖
  2. 非平凡的函数依赖
  3. 多值函数依赖
  4. 传递函数依赖

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 → deptdept → building_no
因此,根据传递性公理, enrol_no → building_no是一个有效的函数依赖。这是一种间接的函数依赖,因此称为传递函数依赖。