【问题标题】:Minimal cover of functional dependency函数依赖的最小覆盖
【发布时间】:2015-12-31 09:46:39
【问题描述】:

我在这个教科书问题上遇到了麻烦

考虑函数依赖集 F = { A → B, B → C, CD → A, AC → D }

计算 F 的最小覆盖。

我正在尝试按照简单的步骤进行操作。首先我可以看到没有右手单例可以做。是否可以在左侧单独列出 CD 和 AC?我必须这样做吗?

这是我的尝试,不遵循步骤方法。对吗?

F = { A→ B, B→C, CD→A, AC → D}
=> F = { A → C, CD → A, AC → D}
=> F = { CD → C, AC → D}
=> F = { D→ C, AC → D}
=> F = {AC → C}
=> F = {A->C}

【问题讨论】:

    标签: database relational-database normalization functional-dependencies


    【解决方案1】:

    如果我理解你的符号,最小覆盖仅包含A→C,但这肯定不是起始F 的覆盖,因为F 中的许多依赖项不能从单个依赖项A→C 派生。例如,您如何从A→C 导出A→B?在最小的封面中,您“简化”了一组功能依赖关系,而不会丢失信息。

    所以,让我们从头开始,看看应该如何继续获得最小的掩护。

    首先,您应该在右侧使用多个属性重写依赖项,正如您所注意到的,这不是必需的。

    然后,对于左边有多个属性的每个依赖,我们应该看看是否可以消除其中的一些。只有两种情况,CD→AAC→D。以这种方式执行检查。如果相对于F 的另一个属性的闭包包括右手,则可以消除一个属性。所以我们必须计算第一个依赖的 C+ 和 D+,以及第二个依赖的 A+ 和 C+。

    C⁺ = {C}
    D⁺ = {D}
    

    两个闭包都不包含A,所以必须保持依赖CD→A

    A⁺ = {A, B, C, D}
    C⁺ = {C}
    

    由于属性A的闭包包含D,所以可以从左边去掉C,新的依赖集合为:

    F' = {A→B, B→C, CD→A, A→D}
    

    此时我们需要检查是否可以消除任何函数依赖,通过计算左侧部分相对于其他依赖项的闭包,并查看此闭包是否包含右侧部分.

    A⁺ = AD
    B⁺ = B
    CD⁺ = CD
    A⁺ = ABC
    

    在任何情况下,闭包都不包含右手,因此F 的最小覆盖是F'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-05
      • 2014-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-01
      • 2020-04-12
      • 2023-03-10
      相关资源
      最近更新 更多