我目前正在研究正常化。我知道如何规范化给定非标准化列表的数据。
但是这个让我有些困惑
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
任何人都可以帮我吗?
答案 0 :(得分:2)
有两个主要问题:
你的FD集中有很多冗余。如果你先计算最小覆盖率,你常常会节省一些时间。
分割关系的方式没有意义,无论规范化水平如何。此关系的候选键是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
。这就是循环依赖的含义。
那就是说,在每个关系中都应该保留所有FD,所以R3
BC -> D
和A -> D
都要保留,但你不需要ABC -> D
不在你的FD中,它显然是多余的。作为一方,A -> D
也是多余的,因为您已经拥有A -> BC, BC -> D
。这就是我提到首先计算最小覆盖率的原因。