软考-软件设计师:数据库技术基础-关系数据库的规范化:函数依赖、部分函数依赖、传递函数依赖、依赖推理规则(自反律、增广律、传递律、合并规则、伪传递规则、分解规则)

函数依赖

设R(U)是属性U上的一个关系模式,X和Y是U的子集,r为R的任一关系,如果对于r中的任意两个元组u,V,只要有u[X]=v[X],就有u[Y]=v[Y],则称X函数决定或称Y函数依赖于X,记为X→Y。

一句话理解

关系模式中,一个或多个属性值,可以决定另一个或多个属性值

一个属性确定另一个属性

关系中的 A属性 能推导出 B属性(A属性 能确定 B属性),那么就说 B属性 依赖 A属性,记为:A → B

正例:知道某学生的 学号,就能确定该学生的 姓名

反例:知道某学生的 年龄,不能确定 该学生的 姓名

一个属性确定多个属性

正例:知道某学生的 学号,就能确定该学生的 姓名、年龄、性别 等属性

反例:知道某学生的 年龄,不能确定 该学生的 姓名、性别 等属性

多个属性确定另一个属性

正例:知道某学生的 学号、学科名,就能确定该学生的 该学科分数

反例:知道某学生的 性别、年龄,不能确定 该学生的 姓名

依赖分类

部分函数依赖

关系模式:R1(A,B,C,D)。关系模式R1有4个属性A,B,C,D

依赖集: {AB → D,A → C}。如上图,AB能推导出D,A能推导出C

主键:AB能确定所有属性,所以 AB 是 候选键,也是主键

非主键 C属性,由 A 推导出,A 是 主键AB 的一部分。非主键属性,由主键的一部分推导出,就是部分函数依赖

传递函数依赖

关系模式: R2(A,B,C)。关系模式R2有3个属性A,B,C

依赖集: {A → B,B → C}。如上图,A能推导出B,B能推导出C

主键:A 能确定 B、C,所以A是主键

由:A → B,B → C,可得出 A → C。C 不直接依赖 主键A,而是通过 B 依赖 主键A,这种就是 传递函数依赖

函数依赖推理规则

有下面3个推理规律:

  • 自反律
  • 增广律
  • 传递律

根据上面3个规律得到下面3条推理规则:

  • 合并规则
  • 伪传递规则
  • 分解规则

A1.自反律(Reflexivity)

若 Y \subseteq X \subseteq U ,则 X \rightarrow Y 成立。

解释:

  • Y \subseteq X \subseteq U: Y 是 X 的子集,X 和 Y 是 U 的子集

  • X \rightarrow Y: X 推导出 Y

整体解释:因为 Y 是 X 的子集,所以知道 X 所有属性值,那自然也就知道了 Y 的属性值

例子

关系模式:R(学号, 姓名, 年龄, 班级)

X = {学号, 姓名}
Y = {姓名}

显然:

Y ⊆ X(姓名 是 学号、姓名 的子集)

根据自反律:X → Y 成立,即:{学号, 姓名} → {姓名}

也就是说,如果你知道了一个学生的 学号 和 姓名,那你当然就知道了他的 姓名

A2.增广律(Augmentation)

若 Z \subseteq U 且 X \rightarrow Y,则 XZ \rightarrow YZ成立

解释:

  • U 是关系模式的所有属性的集合。
  • X、Y、Z 是 U 的子集。
  • X → Y 表示X函数决定Y

整体解释:生成新的函数依赖 XZ → YZ

例子

假设关系模式 R(学号,姓名,年龄,生日,性别),并且有以下函数依赖:

生日 → 年龄

那么根据增广律:

生日,性别 → 年龄,性别

即:如果知道了学生的学号和年龄,就可以确定该学生的姓名和年龄。

A3.传递律(Transitivity)

若 X → Y 且 Y → Z,则 X → Z 成立。

例子

身份证 → 生日 且 生日 → 年龄,则 身份证 → 年龄

合并规则

若 X → Y,X → Z,则 X → YZ

解释:若 X 推导出 Y,X 推导出 Z,那么 X 推导出 YZ

例子

学号 → 姓名,学号 → 手机号,那么 学号 → 姓名,手机号

伪传递规则

与上面传递规则类似,但又不同

若 X → Y,WY → Z,则 XW → Z

解释:若 X 推导出 Y,WY 推导出 Z,那么 XW 推导出 Z

例子

学号 → 姓名,学科名,姓名 → 学科分数,那么 学号,学科名 → 学科分数

分解规则

若 X → Y,Z \subseteq Y,则 X → Z

解释:如果属性集 X 能决定属性集 Y;那么对于 Y 的任意子集 Z,X 也能决定它。

例子

学生表(学号, 姓名, 年龄, 班级, 成绩)

已知一个函数依赖:学号 → {姓名,年龄,班级},
现在取 Z={年龄},那么 {年龄}⊆{姓名,年龄,班级}

根据分解规则,推导出:学号 → 年龄


原文出处:/show_1GW12dp7HTFH.html