我现在正在研究正常化。我知道如何规范化给定非规范化列表的数据。
但这个有点让我困惑

Q. Decompose R{a,b,c,d,e,f} into 2NF using following functional dependencies.

a -> b,c,d,e,f
b,c -> a,d,e,f
b -> f
d -> e

对此,我的回答是:
R0 = a - > b,c
R1 = b,c - > a,d,e
R2 = b - > f

有人能帮我吗?

最佳答案

主要有两个问题:
FDS集合中有很多冗余。如果你先计算最小覆盖率,你通常会节省一些时间。
不管标准化级别如何,分割关系的方式都没有意义。这个关系的候选键是ABC;但是在您的答案中,您将R0中的所有键放在一起,而没有其他键,这是多余的(每个表一个键就足够了)和无用的(考虑一下,在这样的表中没有任何可查询的项!);然后再次将所有键放在R1中,这也是多余的。
分解这种关系的更好方法是

R1(B, F), R2(D, E), R3(A, B, C, D)

它同时满足2nf和3nf。
顺便说一下,您应该查看this Stanford course,了解规范化非常有用。维基百科的页面也写得很好。
编辑以回答有关注释的问题:函数依赖性意味着rhs上的值由lhs上的值决定。在这种情况下,我们有
A -> BC
BC -> A

如果将字母替换为更直观的内容,这相当于:
post_id -> { post_title, post_date }
{ post_title, post_date } -> post_id

也就是说,如果你知道post_id,你可以同时计算出post_titlepost_date;同时,如果你同时知道post_titlepost_date,你可以追溯到post_id。这就是循环依赖的含义。
也就是说,在每种关系中,所有的fds都应该被保留,所以在R3BC -> D保持中,但是您不需要A -> D这不在您的fds集合中,而且它显然是多余的。另一方面,ABC -> D也是多余的,因为您已经有了A -> D。这就是为什么我提到要先计算最小覆盖。

10-08 07:22