我现在正在研究正常化。我知道如何规范化给定非规范化列表的数据。
但这个有点让我困惑
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集合中有很多冗余。如果你先计算最小覆盖率,你通常会节省一些时间。
不管标准化级别如何,分割关系的方式都没有意义。这个关系的候选键是A
和BC
;但是在您的答案中,您将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_title
和post_date
;同时,如果你同时知道post_title
和post_date
,你可以追溯到post_id
。这就是循环依赖的含义。也就是说,在每种关系中,所有的fds都应该被保留,所以在
R3
和BC -> D
保持中,但是您不需要A -> D
这不在您的fds集合中,而且它显然是多余的。另一方面,ABC -> D
也是多余的,因为您已经有了A -> D
。这就是为什么我提到要先计算最小覆盖。