对5NF的依赖

时间:2015-09-09 14:07:56

标签: database-normalization

earlier question on 5NF我想提出问题并在此处添加更多问题。

同样,下表取自online resource on normalization

STOCK
(Agent Company Product)
a1       c1       p1
a1       c2       p1
a1       c1       p3
a1       c2       p4
a2       c1       p1
a2       c1       p2
a3       c2       p4

我的问题是:

  1. 为什么说上面的例子中没有MVD?是因为属性之间的相互关系?
  2. 为什么4NF中的上述关系而不是5NF?

3 个答案:

答案 0 :(得分:1)

多值依赖项(MVD)适用于4NF, 将依赖项(JD)加入5NF。

当表有2个彼此独立的多值列时,表存在4NF的问题,并且已存储了值的所有组合。然而,问题从未以“多值属性”的形式陈述;相反,它以MVD表示。我个人觉得在用JD定义时更容易。在这种情况下,您将拥有一个包含2个组件的JD。

因此,让我们将此应用于您的示例。您首先需要在

上进行投影
0xffd8ff...

首先我们选择Agent,Company

STOCK(Agent Company Product)
      a1       c1       p1
      a1       c2       p1
      a1       c1       p3
      a1       c2       p4
      a2       c1       p1
      a2       c1       p2
      a3       c2       p4

您只需省略列Product,然后删除重复项。

其次我们做代理,产品

AC(Agent Company)
   a1       c1
   a1       c2
   a2       c1
   a3       c2

你现在加入他们并得到:

AP(Agent       Product)
   a1              p1
   a1              p3
   a1              p4
   a2              p1
   a2              p2
   a3              p4

正如您所看到的,ACP1与原始表STOCK不同,因此没有包含2个组件的JD。因此,没有MVD,因此4NF没有问题。它在4NF。

当JD存在3个(或更多)组件时,5NF存在问题。 在手头的示例中,由于只有3列,我们可以做的唯一其他投影是在公司,产品:

ACP1
a1       c1 p1
a1       c1 p3
a1       c1 p4
a1       c2 p1
a1       c2 p3
a1       c2 p4
a2       c1 p1
a2       c1 p2
a3       c2 p4

我们现在需要加入3个投影,看看我们是否得到了原始表格。一半的工作已经完成,因为这是ACP1。我们现在需要加入CP。这会产生:

CP(Company Product)
c1       p1
c2       p1
c1       p3
c2       p4
c1       p2

因为在ACP1中我们已经拥有了所有列,所以加入CP的效果不是添加列;相反,它是过滤掉某些行。

如您所见,ACP2确实与STOCK相同。行的顺序不同并不重要;你得到完全相同的行。所以你有一个JD,因此5NF存在问题;股票不在5NF。

解决方案是你将它拆分(在3个表格中),这不是太难;它只是AC,AP和CP。

我希望这会有所帮助。

LR

答案 1 :(得分:1)

4NF和5NF有点抽象,特别是当你试图用数学方法理解它们时。 当你使用常识方法时,你可能会对平庸的事情感到惊讶。

为了知道多个投影是否一起构成连接依赖关系,您需要首先在原始表上进行这些投影,然后将结果表重新连接在一起。如果这会产生一个与原始表相同的表,那么这些组件就有一个JD。

例如:我正在使用您所引用的幻灯片的符号,更具体地说,请参阅第70页:

* { AC(Agent, Company), AP(Agent, Product), CP(Company Product) }

是一个包含3个组件的JD,我们在上一篇文章中已经看到了它所持有的程序。

虽然

* { AC(Agent, Company), AP(Agent, Product) }

是一个包含2个组件的JD,我们已经看到它不成立。

现在对于包含2个组件的JD,他们真的说你和MVD对一样

Agent ->-> Company
Agent ->-> Product

你也可以将它们写得更加简洁

Agent ->-> Company | Product

FD(例如X - > Y)表示对于给定的X值,您将始终看到相同的Y值。 因此,如果您找到X为5且Y为'f'的第一行,并且您进一步查看值为5的第二行X,那么Y将再次具有值'f'。 如果还没有FD。

你可以用同样的方式直观地理解MVD,但是这次Y有几个值分布在几行上。 所以对于X - > - > Y可以是5,你在一行中找到一个Y(让我们说)'f',另一行有'j',另一行有'm'。 那么你期望其他5也有'f','j','m'。

出于某种原因,我觉得这很容易申请。相反,我更喜欢带有2个组件的JD。

我还注意到您谈论的是MVD代理 - > - >公司,公司 - > - >产品,代理商 - > - >产品。 对于4NF,中间的太多了。对于5NF:它不是关于MVD,而是关于具有3个组件的JD。

在您提出的初步问题中,您问道:

why is it stated that there is no MVD in the above example? 
Is it because of the interrelationships between the attributes?

我通过JD程序获得2个组件并显示JD没有保留,因此也没有MVD。因此4NF是可以的;它在4NF。

所以不,它不是“因为属性之间的相互关系”,我甚至不知道'相互关系'是什么,我只知道FD,MVD和JD。没有MVD,因为程序告诉我。

Why is the above relation in 4NF and not in 5NF?

我还用3个组件完成了程序并显示JD保持,因此关系不在5NF中。 我再次知道这一点,因为我通过了允许我测试(在样本数据上)JD存在假设的过程。

在更直观的层面上: 幻灯片状态(第4页,第67页)

If an agent sells a product and he represents the company making that product, then he sells that product for that company.

这是导致元组强制的业务规则。这是wat使某些组合(公司和产品)强制性。 当然,这是我们想要在数据中检测到的,因为它会导致JD(包含3个组件,但到目前为止你知道)。 对于不在5NF中的关系,通常会有一个业务规则强制某些行在其他行存在时存在。 因此,当代理商a1销售产品p1(可能是另一家公司,让我们说c2)并且公司c1碰巧制造该产品时,(a1 c1 p1)必须存在一行,因为(a1 c2 p1)也存在。

回顾一下:

A sells P                      AP
A represents C                 AC
C makes P                      CP
==> A sells P made by C        STOCK

so the following JD holds :

* { AP(Agent, Product), AC(Agent, Company), CP(Company Product) }

看看这个并深思;它会来找你; - )

答案 2 :(得分:1)

右。

数学公式很笨拙。你应该理解的是,但正式的定义让人难以理解的是:有三种JD:1)琐碎的JDs,2)密钥所暗示的JDs,以及3)其他JDs。

前两个不是问题,因此允许;第三个是问题,你应该通过分割表来摆脱它们。

1)琐碎意味着JD中的一个组件是原始表的整个标题。 (参见幻灯片第70页) 2)密钥隐含意味着每个组件包含一个密钥;这是一个完整的密钥,而不仅仅是密钥的一部分。 (参见第71页) 3)其他JD是有问题的:它们是强大的元组。

"AP, AC and CP are in 5NF because all these projections don't have any JD, is that right?".这是正确的:您需要使用3个组件进行连接依赖,但每个关系中只有2个属性。所以它是不可能的。还要注意,如果将两个属性都包含在其中一个组件中,则JD变得微不足道。