【问题标题】:What is canonical cover, closure and extraneous attribute?什么是规范覆盖、封闭和无关属性?
【发布时间】:2012-06-01 07:14:14
【问题描述】:

我正在研究数据库概念,但有 3 个概念我不明白:规范覆盖、无关属性和闭包。我阅读了有关规范封面的定义,但我不了解它与 3NF 和 BCNF 的关系。规范覆盖的定义似乎是没有多余的属性,而多余的属性是不改变函数依赖集的闭包的属性,而闭包是 F 隐含的所有函数依赖的集合,一组函数依赖.

但这一切都有些模糊,我想知道一个直观的定义和如何计算

  • 规范封面
  • 关闭
  • 无关属性

我相信我理解功能依赖性——如果我们在表中包含这些属性,这就像表中的 PK 一样。

database refinement - minimal cover of F (extraneous attributes) 有一个相当广泛的答案,但我发现很难阅读所有集合定义和代数,我宁愿用简单的英语定义。

例如,具有架构 U={A,B,C,D,E,F,G} 和函数依赖关系

AB → C
B → E
CF → D
C → A
B → F
CE → F
CD → B
B → C

闭包A+,B+,C+,D+,E+,F+是这样计算的吗?

A+ = A
B+ = BCDEF
C+ = A
D+ = D
E+ = E
F+ = F

如果我没记错的话,那么 BCDEFG 是 1NF/2NF 中的超级键(“整个键”),但它是最小 (3NF) 吗?

在闭包和规范覆盖的帮助下,还应该做些什么来将此示例规范化为 1NF、2NF 和 3NF?规范封面和最小封面一样吗?

【问题讨论】:

  • 你不明白的原因是“它是什么样子”的解释是不够的,必须找到、记住和使用精确的定义。他们是不可避免的。 (一旦这样做,“代数”比“简单英语”更易于管理。) PS 这只是要求我们用定制的教程重写教科书/手册。

标签: database-design relational-database database-schema functional-dependencies canonical-form


【解决方案1】:

我知道我迟到了,但也许有人会在某个时候过来。

我认为你犯了一些错误:

对于闭包:

  • B+ 应该是 ABCDEF 而不是 BCDEF 因为 FD C → A
  • C+ 应该是 AC(属性的闭包总是包含它自己)
  • G+G,请参阅第二个项目符号的原因

要计算规范覆盖,请遵循此算法。您需要查看功能依赖项列表:

  1. 左缩减:尝试删除箭头左侧的所有属性,这些属性对于创建相同的闭包不是必需的。 举第一个例子AB → C,您可以计算ABs 闭包,即ABCDEF。然后您尝试删除A,以B → C 结束。现在你只计算B 的闭包,仍然是ABCDEF -> 你可以去掉A。 在此步骤结束时,您的 FD 应类似于 {B → C, B → E, C F → D, C → A, B → F, C E → F, C D → B, B → C, G → G}
  2. 现在你为右手边做同样的事情。请注意,如果需要,您可以在此处删除 all 属性,最终得到空集。举个例子,看B → FB的闭包是ABCDEF。如果你从函数依赖中删除F,最终得到B → ∅,你仍然会得到与以前一样的B闭包。对其他 FD 重复此操作。 您应该以{B →∅, B → E, C F → D, C → A, B →∅, C E → F, C D → B, B → C, G →∅} 结束。
  3. 删除所有X → ∅ 形式的FD。你最终得到{B → E, C F → D, C → A, C E → F, C D → B, B → C}
  4. 组合所有具有相同箭头左侧的 FD,从而得到 {B → C E, C F → D, C → A, C E → F, C D → B} 的规范封面。

对于超级键:见this SO answer

【讨论】:

  • 我没有得到规范形式的第二点 :( 你为什么把 B → F 降为 B → ∅ 和 G → ∅ 也是如此
  • 好吧,我给你举个正确还原的例子。如果尝试减少 FD B → F,可以看到存在 FD B → EB → CC E → F。因为后三个暗示B → C E F,所以有人说FB → F 中是无关的。至于G → G,一个属性总是暗示它自己(G+就是G),所以你可以去掉右边。
【解决方案2】:

闭包A+,B+,C+,D+,E+,F+是这样计算的吗?

“G”怎么了?它在这里的缺席意义重大。你知道为什么吗?

如果我没记错的话,那么 BCDEFG 是一个超级键(“整个键”) 1NF/2NF,但它是最小的(3NF)吗?

Superkey(一个单词,没有空格)不代表整个键;它只是意味着一把钥匙。所有属性的集合是一个平凡的超键,所以 {ABCDEFG} 是一个平凡的超键。

由于 B->C 和 C->A(传递依赖),您可以将平凡的超键简化为 {BCDEFG}。更多的减少是可能的,所以 {BCDEFG} 不是一个最小的超键。 {BCDEFG} 是一个 reducible 超键。

一个最小的超级键是 {BG}。 (我可以说,“{BG} 是不可约的超键。”)还有其他最小超键。

还应该做​​些什么来将此示例规范化为 1NF、2NF 和 3NF 在闭包和规范封面的帮助下?

以防万一您对此有一个常见的误解,通常不可能标准化为 2NF 且不更高,或标准化为 3NF 且不更高。消除部分键依赖(“规范化为 2NF”)可以将所有关系保留在 5NF 中。

下一步是确定所有候选键(所有不可约的超键)。

【讨论】:

    【解决方案3】:

    我的答案来自 Korth 在 Database System Concepts 中给出的算法。

    闭包 A+,B+,C+,D+,E+,F+ 是这样计算的吗? 计算 F 下 (A,B,C,D,E,F) 的闭包的步骤让我们说取 B

    1. 结果 = {B}
    2. 重复
    3. 对于F 中的每个功能依赖项(例如B -> E)做
    4. 开始
    5. 如果B 是结果的子集
    6. 然后result(i.e B) = result(i.e B) U {E}
    7. 结束
    8. 直到(结果停止变化)

    这样,以下的闭包将是: A+ = A

    B+ = ABCDEF

    C+ = AC

    D+ = D

    E+ = E

    F+ = F

    如何检查属性是无关的: 一个属性 A 在依赖 alpha(AB) -> beta(C) if

    中是无关的

    1) A 属于 beta(当前情况下不是)然后创建新的 FD F' = (F-{alpha -> beta}) U {alpha -> (beta - alpha)} 并检查alpha+ under F'(**not F**) includes A,然后Abeta 中是无关的。

    2)A属于alpha(正确),然后新建一个gamma{B} = alpha({AB}) - {A},检查**F** i.e ABCDEF下的gamma+(i.e B+)是否包含beta({C})中的所有属性,为真.所以 AAB->C 中是无关的。

    同样检查CAB->C 中是否无关。所以通过上面建议的算法

    1. F' : AB -> NULL; B →E; CF →D; C →A; B →F; CE →F; CD →B; B →C
    2. F' 下计算AB+,即ABCDEF,其中包括C。所以CAB-> C中是无关紧要的。

    如何计算规范覆盖?

    算法:

    1. F' = F
    2. 如果有类似A->B and A->C 的任何FD 则替换为A->BC(通过联合规则) 这里的 F' 变成了:AB -> C; B-> CEF; C -> A; CD-> B; CE-> F; CF-> D
    3. 在 F' 中找到无关的(左/右),即 A is extraneous in AB->C 删除 A from AB->C ,使其变为 B->C 并更新 F'
    4. 现在检查 F' 是否像以前一样更改。如果更改转到第 2 步并重复,直到发现 F' 不再更改。

    (解释进一步的迭代如下: itr2: F' : B -> C; B-> CEF; C -> A; CD-> B; CE-> F; CF-> D F' : B-> CEF; C -> A; CD-> B; CE-> F; CF-> D 现在检查C in B-> CEF,这不是无关紧要的 检查 E ,这也不是无关紧要的。 检查 F ,这是无关的。 这么新F' : B-> CE; C -> A; CD-> B; CE-> F; CF-> D

    itr3: F' : B-> CE; C -> A; CD-> B; CE-> F; CF-> D 在此之后,没有发现更多无关的属性。

    所以 F 的规范覆盖是:

    B-> CE

    C -> A

    CD-> B

    CE-> F

    CF-> D

    如果上面建议的逻辑有错误,请告诉我。

    【讨论】:

      【解决方案4】:

      是的,规范封面与最小封面相同。 并且所有的闭包都是正确的

      以 3NF 为例..

      1. 只要找到规范封面
      2. 为每个单独的 fd 建立关系。即.. 如果 Fc={AB->C,C->D} 则生成 R1(ABC) & R2(CD)。
      3. 现在检查候选键是否包含在任何一个关系中。如果是,那么它在 3NF 如果不是,则再添加一个仅包含该候选键的关系。 它完成了..!!

      【讨论】:

      • 并非所有的闭包都是正确的,正如上面 Lukas 所指出的那样。
      猜你喜欢
      • 2020-04-08
      • 2015-01-10
      • 1970-01-01
      • 2019-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-04
      相关资源
      最近更新 更多