【问题标题】:Is this decomposition dependency preserving?这种分解依赖是否保留?
【发布时间】:2019-01-06 08:19:38
【问题描述】:

我试图弄清楚如何查看分解是否保留了依赖关系。关系是:R(ABCDEF)并且有以下FD。 AB -> CE,C -> EB,E -> D,C -> D. 然后我们将关系拆分为: R1(BF)、R2(ACB) 和 R3(CDE)。这种依赖是否保留?

我的印象是,要计算这一点,您需要对 FD 的所有左侧进行闭包。这给了:

AB+ = ABCEBD 其中包括 AB -> CE

C+ = CEBD,包括 FD's

E+ = ED 其中包括 E->D

所以在我的世界里,这是依赖保留。然而,根据标记,答案是它不是。我做错了什么和/或误解了这个概念?

为了澄清,我确实理解某些依赖项并不存在于每个分解的关系中。例如 AB -> E 因为我们找不到包含这三个的关系。但是,我认为由于 AB 的关闭仍然包含 E,因此无论如何都将被视为保留依赖关系。这是我出错的地方吗?对此概念的解释(我的教科书非常简短)将不胜感激。

【问题讨论】:

  • 您似乎不明白,当某些 FD 成立时,所有可通过 Armstrong 公理推导的 FD 都成立,并且要保留分解,它必须保留所有这些,而不仅仅是您的那些开始。此外,您需要知道 所有 持有的 FD 以说明它们是否都被保留,因此仅知道给定 FD 持有是不够的,它们必须形成一个掩护。等等 PS 你的教科书名称和版本是什么?除非您告诉我们您的整个过程,否则我们不知道“您哪里出错了”,所以请给它,不要要求我们重写教科书。

标签: database functional-dependencies


【解决方案1】:

简而言之:你是对的,依赖关系被保留了。

长解释。

首先要定义依赖保存的概念,我们需要定义一组函数依赖的投影的概念

给定具有一组依赖项 F 的模式 R(T),并给定 T 的子集 Ti,F 在 Ti 上的 投影 定义为:

πTi = { X → Y ∈ F+ | X, Y ⊆ Ti}

注意,我们需要考虑F+的依赖(F的依赖的闭包),而不仅仅是F上的那些。

我们现在可以为分解定义依赖关系保存属性:

A 分解 ρ = {R1(T1), ..., Rn(Tn具有依赖关系 F 的 R(T) 的 sub>)} 保留依赖关系当且仅当 ∪ πTi(F) ≡ F.

这可以通过应用至少在 1983 年的书籍中描述的算法来正式验证(参见例如:Ullman, J. (1983)。数据库系统原理。计算机科学出版社,马里兰州罗克维尔)一组属性相对于依赖项投影的闭合的多项式时间。

实际上,为了检查您的示例中是否保留了依赖项,无需应用该算法,但计算依赖项的规范覆盖就足够了:

A B → C
C → B
C → E
E → D

从中我们可以看到每个依赖都包含在一个分解的关系中,因此我们可以得出结论,依赖被保留了。

请注意,在对一组依赖项进行推理时,对它们的规范覆盖进行推理总是很方便的。

【讨论】:

  • 如果在其中一个子关系中存在原始关系的键,那么分解必须是依赖保留的,因为该键涵盖了所有依赖关系,这是真的吗?
  • @DsCpp,不,这是不正确的,因为与键不同的属性可能存在其他依赖关系。
猜你喜欢
  • 1970-01-01
  • 2015-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多