如何将表分解为3NF和BCNF

时间:2016-10-29 14:33:23

标签: database database-normalization 3nf bcnf

我通过这种方式找到了一种关系 - CUSTOMER (NAME, STREET, CITY, STATE, ZIP)

用于以下每种方式的缩写,

Name - N
STREET - R
CITY - C
STATE - T
ZIP - Z

给定F = {N->RCT, RCT->Z, Z->CT}

问题会分解为3NFBCNF

我把它分解为3NF,在这里我考虑了实用的方法,

R1(N,R,Z)
R2(Z,C,T)

这是对的吗?

或者我必须只考虑给定的功能依赖性进行分解。如果我这样思考并分解为3NF,那么答案就是

R1(N,R,C,T)
R2(R,C,T,Z)

请有人以正确的方式告诉我。

1 个答案:

答案 0 :(得分:1)

你的第一次分解是不正确的,而第二次是。要在3NF中进行分解,“合成”算法的第一步需要找到依赖关系集的规范封面,然后将具有相同左侧的组中的依赖关系分组。

由于依赖项中没有冗余依赖项或superflous属性,我们可以从具有不同左侧的三个依赖项开始,产生三个关系:

 from N → RCT, R1 (N, R, C, T), with key N
 from RCT → Z, R2 (R, C, T, Z), with key RCT
 from Z → CT, R3 (C, T, Z), with key Z

然后,注意到第三个关系完全包含在第二个关系中,我们可以消除它。算法的最后形式步骤要求我们检查在某些分解关系中是否存在原始关系的关键字(否则应该添加与关键字的新关系)。这是事实,因为Z是一个关键,它存在于第二个关系中。所以,最后的分解是:

 R1 (N, R, C, T), with key N
 R2 (R, C, T, Z), with key RCT

请注意,通过应用“分析”算法来查找BCNF,我们获得了不同的解决方案:

R1 <(N, R, C, T),
    { N → RCT }>

R2 <(C, T, Z),
    { Z → CT } >

R3 <(R, Z),
    { } >

但在此分解中,功能依赖CRT → Z将丢失。