软考-软件设计师:数据库技术基础-关系数据库的规范化:函数依赖、部分函数依赖、传递函数依赖、依赖推理规则(自反律、增广律、传递律、合并规则、伪传递规则、分解规则) 作者:马育民 • 2025-04-30 10:57 • 阅读:10000 # 函数依赖 设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` **正例:**知道某学生的 `学号`,就能确定该学生的 `姓名` **反例:**知道某学生的 `年龄`,**不能确定** 该学生的 `姓名` ### 一个属性确定多个属性 **正例:**知道某学生的 `学号`,就能确定该学生的 `姓名`、`年龄`、`性别` 等属性 **反例:**知道某学生的 `年龄`,**不能确定** 该学生的 `姓名`、`性别` 等属性 ### 多个属性确定另一个属性 **正例:**知道某学生的 `学号`、`学科名`,就能确定该学生的 `该学科分数` **反例:**知道某学生的 `性别`、`年龄`,**不能确定** 该学生的 `姓名` # 依赖分类 ### 部分函数依赖 [](https://www.malaoshi.top/upload/0/0/1GW12VQra1ce.png) **关系模式:**`R1(A,B,C,D)`。关系模式R1有4个属性A,B,C,D **依赖集:** `{AB → D,A → C}`。如上图,AB能推导出D,A能推导出C **主键:**AB能确定所有属性,所以 AB 是 [候选键](https://www.malaoshi.top/show_1GW12GxXe633.html "候选键"),也是主键 非主键 `C属性`,由 `A` 推导出,`A` 是 `主键AB` 的一部分。非主键属性,**由主键的一部分推导出**,就是部分函数依赖 ### 传递函数依赖 [](https://www.malaoshi.top/upload/0/0/1GW12Vh8YVD2.png) **关系模式:** `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={年龄}`,那么 `{年龄}⊆{姓名,年龄,班级}` 根据分解规则,推导出:`学号 → 年龄` 原文出处:http://malaoshi.top/show_1GW12dp7HTFH.html