软考-软件设计师:数据库技术基础-关系数据库的规范化:模式分解及分页应具有的特性(保持函数依赖、无损连接性) 作者:马育民 • 2025-05-01 11:42 • 阅读:10001 # 分解依据 为了让关系模式符合范式,要分解模式,分解后的模式是否与原来的模式等价,有3种情况: - 分解具有无损连接性。 - 分解要保持函数依赖。 - 分解既要无损连接性,又要保持函数依赖。 # 保持函数依赖 >设数据库模式 `p={R1,R2,···,Rk}` 是关系模式R的一个分解,F是R上的函数依赖集,p中每个模式Ri上的FD集是Fi。如果{F1,F2,···,Fk}与F是等价的(即相互逻辑蕴涵)那么称分解p保持FD。 ### 例1 设关系模式 `R(U,F)`,其中 `U={A,B,C,D,E},F={A→BC,C→D,BC→E,E→A}`, 1. 分解 `p={R1(ABCE),R2(CD)}` 是否保持函数依赖? 2. 分解 `p={R1(ABE),R2(CD)}` 是否保持函数依赖? 答案1: 保持依赖,因为: - R1(ABCE):保持 `A→BC,BC→E,E→A` - R2(CD):保持 `C→D` 答案2: 没有保持,因为 `R1(ABE)` 没有 `C`,没有保持 `BC→E` ### 例2 设关系模式 `R(U,F)`,其中 `U={A,B,C},F={A→B,B→C,A→C}`,则分解 `p={R1(AB),R2(BC)}` 是否保持函数依赖? 答案: 保持依赖,因为: - `R1(AB)` 中,保持 `A → B`、`A → C` - `R2(BC)` 中,保持 `B → C` # 无损连接分解 - 有损:不能还原 - 无损:可以还原 无损连接分解:指将一个关系模式 **分解** 成若干个关系模式后,通过 **自然连接** 等运算仍能 **还原到原来** 的关系模式 **自然连接:**以 **同名列** 进行 **等值** 匹配,重复属性保留一个 ### 定理:基于候选键和函数依赖的分析法 **应用场景:** **1拆2** 判断无损 如果R的分解为 `p={R1,R2}`,F为R所满足的函数依赖集合,分解p具有无损连接性的充分必要条件是: `R1 ∩ R2 → (R1 - R2)` 或 `R1 ∩ R2 → (R2 - R1)` **解释:** - `R1 ∩ R2`:表示 `R1` 和 `R2` 的交集,为R1与R2中 **公共属性组成** - `R1 - R2`:表示模式的差集,结果是 `R1` 中有但 `R2` 中没有的属性 - `R2 - R1`:表示模式的差集,结果是 `R2` 中有但 `R1` 中没有的属性 **整体解释:**`R1 ∩ R2` 的结果能够推导出 `(R1 - R2)`,或者,`R1 ∩ R2` 的结果能够推导出 `(R2 - R1)`,就说明无损连接 ### 例子 有关系模式:`成绩(学号,姓名,课程号,课程名,分数)` 函数依赖:`学号→姓名,课程号→课程名, (学号,课程号)→分数` 若将其分解为: - 成绩(学号,课程号,分数) - 学生(学号,姓名) - 课程(课程号,课程名) 请思考该分解是否为无损分解? ##### 答题方法1,两两合并判断发: 1. 先合并 `成绩(学号,课程号,分数)` 和 `学生(学号,姓名)` : 1. 通过同名属性 `学号` 自然连接 2. 由于有:`学号 → 姓名`,`学号` 能够 **确定** `姓名` 3. 所以合并结果:`合并关系1 (学号,课程号,分数,姓名)` 2. 再与 `课程(课程号,课程名)` 合并: 1. 通过同名属性 `课程号` 自然连接 2. 由于有:`课程号 → 课程名`,`课程号` 能够 **确定** `课程名` 3. 所以合并结果:`合并关系2(学号,课程号,分数,姓名,课程名)` 能够还原,所以是无损连接 ##### 答题方法2,表格法(Chase Algorithm): [](https://www.malaoshi.top/upload/0/0/1GW12pJgng4I.png) [](https://www.malaoshi.top/upload/0/0/1GW12pJxIaoM.png) # 例子 [](https://www.malaoshi.top/upload/0/0/1GW12pMhYeQV.png) **提示:** **1拆2** 判断无损,推荐 `基于候选键和函数依赖的分析法` ### 第一问答案 ``` P1 = { R1(AB) , R2(AC) } ``` **判断是否保持依赖:**通过 `R1(AB)` 可知与题干 `F = { A → B}` 相同,说明保持依赖 **判断是否无损连接(基于候选键和函数依赖的分析法):** 1. `R1 ∩ R2` 的结果是 `A` 2. `R1 - R2` 的结果是 `B` 3. 符合题干 `A → B` 说明是无损连接 **(不适合)判断是否无损连接(两两合并发):**合并 `R1(AB)` 和 `R2(AC)`: 1. 通过同名属性 `A` 自然连接 2. 由于 `A → B`,A能确定B 3. 合并结果 `合并(ABC)` 与分解前相同,是无损 最终:保持依赖且无损 ### 第二问答案 ``` P2 = { R1(AB) , R3(BC) } ``` **判断是否保持依赖:**通过 `R1(AB)` 可知与题干 `F = { A → B}` 相同,说明保持依赖 **判断是否无损连接(基于候选键和函数依赖的分析法):** 1. `R1 ∩ R2` 的结果是 `B` 2. `R1 - R3` 的结果是 `A` 3. `R3 - R1` 的结果是 `C` 4. 题干只有 `A → B`,所以 `B` 无法推导 `A` 或 `C` 最终:保持依赖,但有损连接 # 例子 [](https://www.malaoshi.top/upload/0/0/1GW12tmbQ18R.png) ### 答案 D **判断是否无损:** 1. `(A1,A2) ∩ (A1,A3)` 的结果是 `A1` 2. `(A1,A2) - (A1,A3)` 的结果是 `A2` 3. `(A1,A3) - (A1,A2)` 的结果是 `A3` 4. `A1` 无法推导出 `A2` 或 `A3` 所以是有损 **判断是否保持依赖:** - `(A1,A2)`:不符合任何依赖 - `(A1,A3)`:不符合任何依赖,**注意:**看似符合 `A1A3 → A2`,其实不符合,因为 **没有 A2** 所以是不保持函数依赖 原文出处:http://malaoshi.top/show_1GW12txlXm9r.html