4NF,没有函数依赖的多值依赖
4NF, Multivalued Dependencies without Functional Dependencies
很抱歉提出一个可能被认为是基本问题的问题)
假设我们有一个具有多值依赖关系的关系 R(A,B,C,D,E):
A->>B
B->>D.
关系 R 没有任何函数依赖性。
接下来,假设我们将 R 分解为 4NF。
我的考虑:
因为我们没有任何函数依赖,所以唯一的键是所有属性(A、B、C、D、E)。我们可以通过两种方式分解关系 R:
- R1(A,B) R2(A,C,D,E)
- R3(B,D) R4(A,B,C,E)
我的问题是 - 这两个分解是最终的吗?看起来它们是因为没有剩余的非平凡的多值依赖关系。还是我遗漏了什么?
A Table 在 4NF 中当且仅当对于它的每一个非平凡的多值依赖项 X -> Y,X 是一个超级键——也就是说,X 是候选键或一个超集。
在您的第一次分解中(1 与 R1 和 R2)B->>D 不令人满意,因此它不是依赖性保留分解,而且在 4NF 中也不是,因为 A 在第二个 table 中不是超级键。
另一方面,第二次分解(2 与 R3 和 R4)是依赖关系保留和无损连接,B 和 ACE 作为各自 table 中的主键,但它不在 4NF 中,因为 A->> B 依赖存在于第二个 table 中,而 A 不是超键,你必须将第二个 table 进一步分解为两个 table,可以是 {A B} 和 {A C E}。
那么,如果我按照您的推理 (suraj3),R1(A,B) 和 R2(B,C,D,E) 是否正确分解?我认为这将保留 FD B->>D。
Relation R doesn't have any functional dependencies.
你的意思是,非平凡的 FD(函数依赖)。 (必须总是有琐碎的 FD。)
假设 R 中持有的 MVD(多值依赖)是 {A ↠ B, B ↠ D} 的传递闭包中的那些:
在1 R1(A,B) R2(A,C,D,E)中,我们可以将R重构为R1 JOIN R2并且R1和R2都在4NF中并且它们的连接将满足A ↠ B。如果一些组件包含其他 MVD 的所有属性,然后我们可以根据该 MVD 进一步分解它。我们会知道,给定所有组件的一些所谓的值,他们所谓的通过连接重建 R 将满足两个 MVD。但是这里没有这样的组件。所以我们不能进一步分解。而且我们知道所谓的通过加入对 R 的重构满足 A ↠ B 但我们仍然必须检查 B ↠ D 是否。我们说 MVD B ↠ D 是 "not preserved" 并且分解为 R1 和 R2 "does not preserve MVDs".
在 2 R3(B,D) R4(A,B,C,E) 中,我们可以将 R 重构为 R3 JOIN R4 并且 R3 & R4 都在 4NF 中并且连接将满足 B ↠ D。现在一些组件包含其他 MVD 的所有属性,因此我们可以根据该 MVD 进一步分解它。我们知道,给定所有组件的一些所谓的值,他们所谓的通过连接对 R 进行的重构满足两个 MVD。该组件是 R4,我们可以将其进一步分解,重构为 AB JOIN ACE。并且我们知道所谓的通过连接重构 R 满足 A ↠ B & B ↠ D。因为原始中的 MVD 出现在组件中,所以我们说这些分解 "preserve MVDs".
PS 1 4NF分解必须是三分量
MVD 总是成对出现。假设 MVD X ↠ Y 与属性 S 保持关系,归一化为分量 XY 和 X(S-Y)。请注意,S-XY 是非 X 非 Y 属性的集合,并且 X(S-Y) = X(S-XY)。然后还有一个MVD X ↠ S-XY,归一化为分量X(S-XY) & X(S-(S-XY)),即X(S-XY) & XY,即X(S-Y) & XY .为什么?请注意,两个 MVD 给出了相同的组件对。即两个 MVD 描述相同的条件,即 S = XY JOIN X(S-XY)。因此,当 MVD 持有时,该合作伙伴也持有。我们可以使用特殊的显式和对称符号 X ↠ Y | 来写出每个 MVD 所表达的条件。 S-XY.
我们说 S 的某些组件的 JD(连接依赖性)成立当且仅当它们连接到 S 时。所以如果 S = XY JOIN X(S-Y) = XY JOIN X(S-XY) 那么 JD *{XY, X(S-XY)} 成立。即两个 MVD 描述的条件是 JD。所以某个MVD和某个二进制JD是对应的。这是了解为什么规范化 MVD 涉及双向连接以及为什么 MVD 成对出现的一种方式。导致 4NF 关系不在 5NF 中的 JD 是 not 对应于 MVD 的 JD。
您的示例涉及两个非伙伴的 MVD,并且两者都不因另一个而成立,因此您知道无损分解的最终形式将涉及两个联接,每个 MVD 对一个。
PS 2 歧义"Suppose we have a relation with these multi-valued dependencies"
当根据 FDs(函数依赖)分解时,我们通常会得到一个 canonical/minimal 覆盖 relation,即特定形式的集合,其根据阿姆斯特朗公理的传递闭包(必须因此成立的 FD 集合)包含关系中的所有 FD。当我们被告知某些 FD 成立时,这一点经常被遗忘。我们必须要么得到关系的 canonical/minimal 覆盖,要么得到一个任意集合,并被告知关系中持有的 FD 是其传递闭包中的 FD。如果我们只得到一组成立的 FD,我们知道其传递闭包中的 FD 成立,但可能还有其他的。所以一般情况下我们不能归一化。
在这里你给出一些持有的 MVD。但他们不是唯一的,因为每个人都有一个合作伙伴。此外,其他人可能(并且在这里确实)因此成立。 (例如 X ↠ Y 和 Y ↠ Z 意味着 X ↠ Z-Y 成立。)但您不会说它们形成规范或最小覆盖。获得 MVD 规范形式的一种方法(每个传递闭包一个唯一的形式,希望更简洁!)将是一个最小的覆盖(一个不能丢失任何 MVD 并且仍然具有相同的传递闭包)由合作伙伴扩充每个 MVD。 (而对于 FD,标准规范形式是最小的。)您也不要说 "the MVDs that hold are those in the transitive closure of these"。你只是说那些 MVD 成立。所以也许一些不在传递闭包中的人也会这样做。所以你的例子无法解决。我们可以猜测您的意思可能是这是一个最小的封面。 (这不是规范的。)或者关系中持有的 MVD 是给定的传递闭包中的 MVD。 (在这种情况下,这是一个最小的封面。)
很抱歉提出一个可能被认为是基本问题的问题)
假设我们有一个具有多值依赖关系的关系 R(A,B,C,D,E):
A->>B B->>D.
关系 R 没有任何函数依赖性。 接下来,假设我们将 R 分解为 4NF。
我的考虑:
因为我们没有任何函数依赖,所以唯一的键是所有属性(A、B、C、D、E)。我们可以通过两种方式分解关系 R:
- R1(A,B) R2(A,C,D,E)
- R3(B,D) R4(A,B,C,E)
我的问题是 - 这两个分解是最终的吗?看起来它们是因为没有剩余的非平凡的多值依赖关系。还是我遗漏了什么?
A Table 在 4NF 中当且仅当对于它的每一个非平凡的多值依赖项 X -> Y,X 是一个超级键——也就是说,X 是候选键或一个超集。
在您的第一次分解中(1 与 R1 和 R2)B->>D 不令人满意,因此它不是依赖性保留分解,而且在 4NF 中也不是,因为 A 在第二个 table 中不是超级键。
另一方面,第二次分解(2 与 R3 和 R4)是依赖关系保留和无损连接,B 和 ACE 作为各自 table 中的主键,但它不在 4NF 中,因为 A->> B 依赖存在于第二个 table 中,而 A 不是超键,你必须将第二个 table 进一步分解为两个 table,可以是 {A B} 和 {A C E}。
那么,如果我按照您的推理 (suraj3),R1(A,B) 和 R2(B,C,D,E) 是否正确分解?我认为这将保留 FD B->>D。
Relation R doesn't have any functional dependencies.
你的意思是,非平凡的 FD(函数依赖)。 (必须总是有琐碎的 FD。)
假设 R 中持有的 MVD(多值依赖)是 {A ↠ B, B ↠ D} 的传递闭包中的那些:
在1 R1(A,B) R2(A,C,D,E)中,我们可以将R重构为R1 JOIN R2并且R1和R2都在4NF中并且它们的连接将满足A ↠ B。如果一些组件包含其他 MVD 的所有属性,然后我们可以根据该 MVD 进一步分解它。我们会知道,给定所有组件的一些所谓的值,他们所谓的通过连接重建 R 将满足两个 MVD。但是这里没有这样的组件。所以我们不能进一步分解。而且我们知道所谓的通过加入对 R 的重构满足 A ↠ B 但我们仍然必须检查 B ↠ D 是否。我们说 MVD B ↠ D 是 "not preserved" 并且分解为 R1 和 R2 "does not preserve MVDs".
在 2 R3(B,D) R4(A,B,C,E) 中,我们可以将 R 重构为 R3 JOIN R4 并且 R3 & R4 都在 4NF 中并且连接将满足 B ↠ D。现在一些组件包含其他 MVD 的所有属性,因此我们可以根据该 MVD 进一步分解它。我们知道,给定所有组件的一些所谓的值,他们所谓的通过连接对 R 进行的重构满足两个 MVD。该组件是 R4,我们可以将其进一步分解,重构为 AB JOIN ACE。并且我们知道所谓的通过连接重构 R 满足 A ↠ B & B ↠ D。因为原始中的 MVD 出现在组件中,所以我们说这些分解 "preserve MVDs".
PS 1 4NF分解必须是三分量
MVD 总是成对出现。假设 MVD X ↠ Y 与属性 S 保持关系,归一化为分量 XY 和 X(S-Y)。请注意,S-XY 是非 X 非 Y 属性的集合,并且 X(S-Y) = X(S-XY)。然后还有一个MVD X ↠ S-XY,归一化为分量X(S-XY) & X(S-(S-XY)),即X(S-XY) & XY,即X(S-Y) & XY .为什么?请注意,两个 MVD 给出了相同的组件对。即两个 MVD 描述相同的条件,即 S = XY JOIN X(S-XY)。因此,当 MVD 持有时,该合作伙伴也持有。我们可以使用特殊的显式和对称符号 X ↠ Y | 来写出每个 MVD 所表达的条件。 S-XY.
我们说 S 的某些组件的 JD(连接依赖性)成立当且仅当它们连接到 S 时。所以如果 S = XY JOIN X(S-Y) = XY JOIN X(S-XY) 那么 JD *{XY, X(S-XY)} 成立。即两个 MVD 描述的条件是 JD。所以某个MVD和某个二进制JD是对应的。这是了解为什么规范化 MVD 涉及双向连接以及为什么 MVD 成对出现的一种方式。导致 4NF 关系不在 5NF 中的 JD 是 not 对应于 MVD 的 JD。
您的示例涉及两个非伙伴的 MVD,并且两者都不因另一个而成立,因此您知道无损分解的最终形式将涉及两个联接,每个 MVD 对一个。
PS 2 歧义"Suppose we have a relation with these multi-valued dependencies"
当根据 FDs(函数依赖)分解时,我们通常会得到一个 canonical/minimal 覆盖 relation,即特定形式的集合,其根据阿姆斯特朗公理的传递闭包(必须因此成立的 FD 集合)包含关系中的所有 FD。当我们被告知某些 FD 成立时,这一点经常被遗忘。我们必须要么得到关系的 canonical/minimal 覆盖,要么得到一个任意集合,并被告知关系中持有的 FD 是其传递闭包中的 FD。如果我们只得到一组成立的 FD,我们知道其传递闭包中的 FD 成立,但可能还有其他的。所以一般情况下我们不能归一化。
在这里你给出一些持有的 MVD。但他们不是唯一的,因为每个人都有一个合作伙伴。此外,其他人可能(并且在这里确实)因此成立。 (例如 X ↠ Y 和 Y ↠ Z 意味着 X ↠ Z-Y 成立。)但您不会说它们形成规范或最小覆盖。获得 MVD 规范形式的一种方法(每个传递闭包一个唯一的形式,希望更简洁!)将是一个最小的覆盖(一个不能丢失任何 MVD 并且仍然具有相同的传递闭包)由合作伙伴扩充每个 MVD。 (而对于 FD,标准规范形式是最小的。)您也不要说 "the MVDs that hold are those in the transitive closure of these"。你只是说那些 MVD 成立。所以也许一些不在传递闭包中的人也会这样做。所以你的例子无法解决。我们可以猜测您的意思可能是这是一个最小的封面。 (这不是规范的。)或者关系中持有的 MVD 是给定的传递闭包中的 MVD。 (在这种情况下,这是一个最小的封面。)