3NF 规范化问题,我可以使用派生的 FD 来确定关系不在 3NF 中吗?

3NF Normalisation Question, can I use a derived FD to determine a relation is not in 3NF?

我有以下问题:

Consider relation R(A, B, C, D, E, F, H) with the following functional dependencies:

A --> D, AE --> H, DF --> BC, E --> C, H --> E

Consider three relational schema R1(A, D), R2(E, C), and R3(A, B, E, F, H). They form a decomposition for R.

(a) Do the original functional dependencies apply in R1, R2, and R3?
(b) Is this decomposition in 3NF? Explain your answer.

我的尝试:

(a) 只要关系包含函数依赖中的属性,原始函数依赖就适用于 R1、R2 和 R3。

(b) R3 中的编号键 = {AEF, AFH}。从 R 中的 {AF}+ = {ABCDF},在 R3 中 {AF}+ = {ABF}。因此我们可以形成一个函数依赖 AF --> B,并且这个函数依赖的 LHS 不包含键。 RHS 也不只包含关键属性。

提供的解决方案没有直接解决(a),并声明分解是在 3NF 中,因为原始 FD 不违反 3NF。想知道我在这里做错了什么。谢谢!

在下文中,我假设给定的依赖项是覆盖 R.

的依赖项

(a) Do the original functional dependencies apply in R1, R2, and R3?

当一个人分解一个关系时,覆盖的依赖不一定适用于分解的关系。当分解的关系不包含依赖项的所有属性时,就会发生这种情况。例如,在您的示例中,DF -> BC 不适用于 R1R2R3,因为属性 DFBC 并非全部存在于单一关系(我们知道函数依赖只在关系内部有意义)。

这不一定意味着分解会遭受“依赖性损失”,因为定义更复杂:具有属性 A 和依赖性覆盖 F 的关系模式 R 的分解保留依赖性当且仅当F 的依赖项在分解关系上的投影的并集是 F 的覆盖。

在 Ullman 的数据库系统原理,计算机科学出版社,1983 年中,展示了一种算法来计算一组依赖项在分解上的投影并集的闭合。在您的特定情况下,通过应用该算法,我们可以发现依赖项 DF -> BC 实际上丢失了。

(b) Is this decomposition in 3NF?

你的回答是正确的,因为第三个分解关系不在 3NF 中。正如您正确指出的那样,此关系的候选键是 {AEF, AFH},而在关系中依赖 AF -> B 成立,这是违反 3NF 的依赖,因为 AF 不是超级键并且 B 不是主要属性。