将关系分解为 2NF 然后分解为 3NF

ora*_*nge 3 normalization database-design

我目前正在为我的考试而学习,我遇到的麻烦是如何将具有给定函数依赖关系的关系 R 分解为 2NF 然后是 3NF。

例如对于以下 R 和函数依赖项:

R = {A, B, C, D, E, F, G, H, I, J}

Functional dependencies F = ( {A, B} -> {C}, {A} -> {D, E}, {B} -> {F}, {F} -> {G, H}, {D} -> {I,J} }

我知道首先你必须找出闭包来找到 R 的键,我已经完成了,键是 {A,B},现在这就是我卡住的地方。除了 2NF 和 3NF 的定义之外,我的教科书没有给出任何关于如何解决这个问题的例子。

关于我如何做到这一点的示例将不胜感激。

Joe*_*own 7

2NF:删除部分依赖

R = {A, B, C, D, E, F, G, H, I, J} 包括部分依赖。

D 和 E 仅依赖于 A,F 仅依赖于 B、G、H、I 和 J 根本不依赖于密钥(直接)。

R0 = { A, B , C}

R1 = { A , D, E, I, J}

R2 = { B , F, G, H}

R0、R1 和 R2 不包含部分依赖(或重复组),因此它们是 2NF。然而 R1 和 R2 仍然是一个问题,因为它们包含传递依赖

3NF:删除传递依赖

I 和 J 取决于 D,而不是 R1 的键。因此,您需要按如下方式进一步规范化 R1:

R1 = { A , D, E, I, J}

R1a = { A , D, E}

R1b = { D , I, J}

同样,G 和 H 仅依赖于 F,因此 R2 必须分解如下:

R2 = { B , F, G, H}

R2a = { B , F}

R2b = { F , G, H}

现在你剩下的所有关系(R0、R1a、R1b、R2a、R2b)都没有重复组、部分依赖和传递依赖。这意味着您的关系处于 3NF。

当您查看尚未规范化的关系和一系列依赖项时,您通常可以通过检查来规范化,只需识别您的主键将是什么。在功能上决定其他属性的任何属性或属性组合都将作为主键结束。一旦定义了主键,您只需要弄清楚每个键对应哪些非键属性。从你的函数依赖是什么的陈述中可以明显看出这一点。