我正在寻找一种易于理解的算法来计算(手动)一组函数依赖项的闭包。 一些消息来源,包括我的导师说,我应该只使用阿姆斯特朗的公理,看看我能得到什么。对我来说,这不是一个系统的方式(即容易错过的东西)。
我们的课程教材(数据库系统 - 完整的书,第2版)也没有为此提供算法。
答案 0 :(得分:1)
以更“系统化”的方式,这可能是您正在寻找的算法。使用前三个阿姆斯特朗的公理:
我从this presentation notes获取的。但是,我发现以下方法更容易实现:
取自here
答案 1 :(得分:1)
在FD的集合F下由α在功能上确定的所有属性的集合。
例如。假设我们有这些起始FD,我们想用下面的一次计算所有闭包。
A -> BC
AC -> D
D -> B
AB -> D
以上计算的更多FD计划一次
A+ -> (A,B,C,D)
B+ -> (B)
同样我们可以计算C +,D +,(AC)+,(AB)+等...
有一个非常容易的alg。通过
计算所有FD集合RESULT <- α
MODIFIED <- TRUE
WHILE(MODIFIED) {
MODIFIED <- FALSE
∀ FD A->B IN F DO{
IF A ⊂ RESULT {
RESULT <- (RESULT) ∪ (B)
MODIFIED <- TRUE IF RESULT CHANGES
}
}
}
答案 2 :(得分:0)
如果通过“播放”他意味着详尽的搜索,那么这绝不是系统性的;)并且一个简单的解决方案可能看起来像逐个规则的依赖集的迭代扩展*)似乎只是要重新访问的项目队列和一些(两个?)循环..你试过吗?
顺便说一下。谷歌搜索我立即发现http://www.cs.sfu.ca/CourseCentral/354/zaiane/material/notes/Chapter6/node12.html - 但我无法验证它是否合理,因为笔记本电脑中的电池确实在下降!
*)简单地说:只要在前一次迭代中发生任何变化,就迭代地应用它们。当应用所有这些时,它们不会改变当前状态中的任何内容(即(A - > ABCDEF)+ =(ADEF)==&gt;(A - > ABCDEF)因此没有新的符号被添加到集合中),然后这意味着,没有进一步的扩展可以扩展它,所以我认为这就是假设没有更多增长的设置是完整的。