函数依赖
设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={年龄},那么 {年龄}⊆{姓名,年龄,班级}
根据分解规则,推导出:学号 → 年龄

