数据库系统工程师 · 高频练习

函数依赖集怎样拆分右部、约简左部并删除冗余依赖?

中级 单选题 第 866 题 中等 数据库系统工程师最小函数依赖集最小覆盖冗余依赖函数依赖
题目

函数依赖集 F={A→BC,B→C,A→B,AB→C}。与 F 等价的一个最小函数依赖集是()。

A {A→C,B→C}
B {A→B,B→C}
C {A→B,AB→C}
D {A→B,A→C,B→C}
题目类型:原创高频练习题 用途:用于帮助理解数据库系统工程师相关考点和答案解析,不等同于官方真题。
正确答案
B
答案解析

先把 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

错误。该集合不能由 A 推出 B,因此无法覆盖原依赖 A→B。

B

正确。A→B 与 B→C 可推出 A→C 和 AB→C,同时两条依赖都不可再删除或约简。

C

错误。只有 A→B 和 AB→C 时,单独的 B 不能推出 C,无法保持原依赖 B→C。

D

错误。虽然与原依赖等价,但 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}。