给定以下函数依赖关系,我将如何计算最小覆盖:

A -> B, ABCD -> E, EF -> GH, ACDF -> EG

在课堂讲稿中,它给出了最小覆盖的推导,但我不理解.

For example for getting rid of ACDF -> E:

A -> B => AACD -> BACD -> E => ACD -> E => ACDF -> E

And then they say, similarly we do not keep ACDF -> G

And then I understand that ABCD -> E is deduced to ACD -> E because A -> B, but I do not understand the formal process of how to get to that.

所以我的问题是,有没有人能解释一下如何生成一组函数依赖的最小覆盖?

推荐答案

要获得最小的覆盖范围,您必须执行两个步骤.为了演示,我将首先将依赖项拆分为多个(右侧只有一个属性),以使其更清晰:

A -> B
ABCD -> E
EF -> G
EF -> H
ACDF -> E
ACDF -> G

请按以下顺序(#1,然后#2)执行以下步骤must,否则可能会得到错误的结果.

1) 消除冗余属性(减少左侧):

取左侧,并try 每次删除一个属性,然后try 推导出右侧(现在所有依赖项只有一个属性).如果您成功了,则可以从左侧取出该字母,然后继续.请注意,可能有多个正确的结果,这取决于您执行缩减的顺序.

您会发现,您可以从依赖项ABCD -> E中删除B,因为ACD -> ABCD(使用first dep.)从ABCD -> E开始.您可以使用完整的Dep.你目前正在减少,这一开始有时会令人困惑,但如果你仔细想想,就会发现你可以做到这一点.

同样,您可以从ACDF -> E中删除F,因为ACD -> ABCD -> ABCDE -> E(您显然可以从字母本身推导出单个字母).完成此步骤后,您将获得:

A -> B
ACD -> E
EF -> G
EF -> H
ACD -> E
ACDF -> G

这些规则仍然代表与原始规则相同的依赖关系.请注意,现在我们有一个重复的规则ACD -> E.如果你把整个事情看作一个集合(在数学意义上),那么当然你不可能在一个集合中有两个相同的元素.现在,我只是把它放在这里两次,因为下一步无论如何都会把它处理掉.

2) 摆脱多余的依赖关系

现在,对于每个规则,try 删除它,看看是否只使用其他规则来推断相同的规则.当然,在这一步中,您不能使用dep.您当前正试图删除它(您可以在上一步中删除).

如果你把第一条规则A -> B的左边隐藏起来,你会发现你无法从A中推断出任何东西.因此,这条规则并非多余.对所有其他人也一样.你会发现,你可以(显然)删除其中一个重复的规则ACD -> E,但严格来说,你也可以使用算法.只隐藏两条相同规则中的一条,然后取左侧(ACD),用另一条来推断右侧.因此,您可以删除ACD -> E(当然只能删除一次).

你还会看到你可以go 掉ACDF -> G,因为ACDF -> ACDFE -> G.现在的结果是:

A -> B
EF -> G
EF -> H
ACD -> E

这是原版的最小封面.

Database相关问答推荐

如何将表字段的默认值设置为 0.00?

估计数据库大小

多列索引的顺序

用于为 Android 设计 SQLite 数据库的开发人员工具

mysql搜索表名的段

TSQL - 表值函数中的 If..Else 语句 - 无法通过

主必须包括表的分区位置错误中的所有列?

当使用多个 WHEN MATCHED 语句时,它们是全部执行,还是只执行一个?

如何禁用 Django 查询缓存?

SqlAlchemy 中的动态表创建和 ORM 映射

JavaScript 布尔搜索查询生成器接口库?

在现有数据库上使用 liquibase

数据库与微服务的一致性

App=EntityFramework 在 Sql 连接字符串中有什么作用?

多个和单个索引

在连接表中,Rails 缺少组合键的最佳解决方法是什么?

MySQL:为什么使用 VARCHAR(20) 而不是 VARCHAR(255)?

每个开发人员一个数据库?

sqlite 时间戳格式化

SQLite 数据库方案作为实体关系模型