BCNF 和函数依赖

BCNF and Functional dependency

我正在尝试了解 BCNF 的分解。我已经阅读了很多例子,但我仍然不明白一些事情。我按照这个 尝试解决以下问题:

属性是客户名称 (A)、地址 (B)、phone(C)、身份 (D),账户有编号 (E)、类型 (F) 和余额 (G)。

如果客户只有一个 ID、姓名、地址和 phone 号码,而账户只有一个号码、类型和余额,并且由一个且只有一个客户拥有,那么功能依赖性保持什么?使用 R(ABCDEFG)

的这些依赖关系给出 BCNF 分解

到目前为止我得到了什么:

首先获取题中指定的FD:

D -> ABC // If we agree on same customer ID, then we agree on the name, address and phone #
E -> DFG // If we agree Account number, then we agree on customer ID, account balance and account type

我们唯一的候选键是:{E},因为所有属性都可以用这个属性获得。

由于没有多余的左侧属性,也没有冗余的 FD,所以我得到以下关系表:

R1={D, A, B, C}
R2={E, D, F, G}

粗体

标出了这两个关系中的key

现在检查 BCNF 我们检查是否有这些关系 (R1,R2) 违反了 BCNF 的条件( 即对于 每个 函数依赖 X->Y 左侧 ( X) 必须是一个超级键) .

现在我们可以看到 E -> DFG 有一个左边是超级键。但是 D -> ABC 没有作为超级键的左侧。所以 FD 违反了 BCNF。但是我不知道如何分解成BCNF。

当您检查分解关系的 BNCF 是否满足时,您必须分别检查每个关系的函数依赖性。

因此,在 R1={D, A, B, C} 中,唯一的(候选)键是 D(正如您所指出的),所有 non-trivial 依赖项只有 D 作为左边部分;在 R2={E, D, F, G} 中,唯一的(候选)键是 E,所有 non-trivial 依赖项只有 E 作为左侧部分。所以在这两种关系中都没有(non-trivial)违反BCNF的依赖关系,所以分解是正确的,不需要做任何其他事情。