函数依赖集 F={A→BC,B→C,A→B,AB→C}。与 F 等价的一个最小函数依赖集是()。
先把 A→BC 拆成 A→B 和 A→C,并合并重复的 A→B。由于 A→B、B→C 可以推出 A→C,所以 A→C 冗余;AB→C 中的 A 是多余属性,因为仅凭 B→C 已能推出 C,因此 AB→C 也可删除。最终保留 {A→B,B→C},它仍能推出原依赖集中的全部依赖。
选项分析
错误。该集合不能由 A 推出 B,因此无法覆盖原依赖 A→B。
正确。A→B 与 B→C 可推出 A→C 和 AB→C,同时两条依赖都不可再删除或约简。
错误。只有 A→B 和 AB→C 时,单独的 B 不能推出 C,无法保持原依赖 B→C。
错误。虽然与原依赖等价,但 A→C 可由 A→B、B→C 推出,仍是冗余依赖,不满足最小性。
本题为什么容易错
最常见的误区是把“与原集合等价”当成“已经最小”。选项 D 能推出原来的依赖,但其中 A→C 仍可被另外两条推出,所以它只是等价覆盖,不是最小覆盖。
简短答案
函数依赖集怎样拆分右部、约简左部并删除冗余依赖,正确答案是 B({A→B,B→C})。先把 A→BC 拆成 A→B 和 A→C,并合并重复的 A→B。由于 A→B、B→C 可以推出 A→C,所以 A→C 冗余;AB→C 中的 A 是多余属性,因为仅凭 B→C 已能推出 C,因此 AB→C 也可删除。最终保留 {A→B,B→C},它仍能推出原依赖集中的全部依赖。
易混淆概念对比表
| 概念 | 本题判断 | 区别要点 | 记忆提示 |
|---|---|---|---|
| {A→C,B→C} | 本题干扰项 | 错误。该集合不能由 A 推出 B,因此无法覆盖原依赖 A→B。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
| {A→B,B→C} | 本题正确答案 | 正确。A→B 与 B→C 可推出 A→C 和 AB→C,同时两条依赖都不可再删除或约简。 | 看到题干核心场景时优先联想到它 |
| {A→B,AB→C} | 本题干扰项 | 错误。只有 A→B 和 AB→C 时,单独的 B 不能推出 C,无法保持原依赖 B→C。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
| {A→B,A→C,B→C} | 本题干扰项 | 错误。虽然与原依赖等价,但 A→C 可由 A→B、B→C 推出,仍是冗余依赖,不满足最小性。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
本题易混淆选项怎么区分
- {A→C,B→C}:错误。该集合不能由 A 推出 B,因此无法覆盖原依赖 A→B。
- {A→B,AB→C}:错误。只有 A→B 和 AB→C 时,单独的 B 不能推出 C,无法保持原依赖 B→C。
- {A→B,A→C,B→C}:错误。虽然与原依赖等价,但 A→C 可由 A→B、B→C 推出,仍是冗余依赖,不满足最小性。
知识点详解
函数依赖集的最小覆盖又称最小函数依赖集或规范覆盖。常见要求是每条依赖右部只有一个属性、左部不存在多余属性、集合中不存在可由其他依赖推出的冗余依赖,并且与原依赖集等价。判断左部属性是否多余和判断整条依赖是否冗余,都可以借助属性闭包完成。最小覆盖有助于关系模式综合和规范化分析,但不同推导顺序可能得到形式不同、逻辑等价的最小集合,因此答题时还要按依赖闭包检查等价性。
备考速记
右部先拆单,左部再瘦身,最后逐条拿走看还能不能推出。
函数依赖在函数依赖场景中的作用
函数依赖在本题中的核心价值,是解决“函数依赖集 F={A→BC,B→C,A→B,AB→C}。与 F 等价的一个最小函数依赖集是()”这个场景问题。复习时不要只背选项名称,还要理解它为什么适用于该场景,以及它能解决哪类安全、流程或管理问题。
同类题怎么考
- 将右部含多个属性的函数依赖拆成单属性依赖。
- 判断复合左部中是否存在多余属性。
- 给出多个等价依赖集,选择已经删除全部冗余项的最小覆盖。
函数依赖在数据库系统工程师软考中的考法
软考选择题通常不会只考概念定义,还会把函数依赖放到函数依赖场景中,要求判断它的作用、适用范围或与相近概念的区别。遇到这类题时,先抓住题干中的业务场景,再看哪个选项最能解决该场景下的核心问题。
解题思路
这题不要试图一眼看答案,按流水线处理最稳。第一步把 A→BC 拆开,得到 A→B、A→C,再加原来的 B→C、A→B、AB→C;重复的 A→B 只留一条。第二步看 AB→C,去掉 A 后仍有 B→C,所以 A 在左部多余。第三步看 A→C,它可以沿 A→B→C 推出来,也没必要单独保留。最后只剩 A→B 和 B→C,两条都不能再删。
考点定位
求最小覆盖通常按三步:右部拆成单属性、约简左部多余属性、逐条删除可由其余依赖推出的冗余依赖。每删一条都要用剩余依赖重新验证。
易错提醒
- 没有先拆分右部,直接在 A→BC 上判断冗余,步骤容易混乱。
- 检查某条依赖是否冗余时仍把它留在依赖集中,结果当然总能推出自己。
- 删掉 AB→C 后没有确认 B→C 仍然存在,误删了原集合必须保持的约束。
备考提示
- 检验 X→Y 是否冗余时,临时移除该依赖,再计算 X 在剩余依赖下的闭包,看是否仍包含 Y。
- 最小覆盖的写法可能不完全唯一,但必须满足右部单属性、左部无多余属性、依赖无冗余并与原集合等价。
你可能还想了解
- 函数依赖右部为什么要拆成单属性?
- 怎样判断函数依赖左部有多余属性?
- 删除冗余依赖时为什么要先临时移除它?
- 最小覆盖是否一定只有唯一写法?
本文小结
将A→BC拆分后,A→C可由A→B和B→C传递推出;AB→C中的A也是多余的,因为B单独即可推出C。删除重复和冗余项后,最小函数依赖集为{A→B,B→C}。