首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何理解第五范式?

如何理解第五范式?
EN

Stack Overflow用户
提问于 2013-08-03 05:54:39
回答 3查看 13.9K关注 0票数 15

我使用两个在线来源,以获得对5NF的理解,没有任何严格的数学和证明。

  1. A Simple Guide to Five Normal Forms in Relational Database Theory (作者: Kent.这篇文章似乎是由CJ Date本人在他的一篇文章中审阅和认可的)
  2. Fifth Normal Form (维基百科文章)

然而,我无法理解这些引用!

让我们首先检查引用#1 (Kent's)。

它说:“但假设某项规则生效:如果代理商销售某一产品,而他代表一家公司生产该产品,那么他就为该公司出售该产品。”

然后,继续分解原来的表(所有的表名都是我给的).

代码语言:javascript
复制
acp(agent, company, product)

-----------------------------
| AGENT | COMPANY | PRODUCT |
|-------+---------+---------|
| Smith | Ford    | car     | 
| Smith | Ford    | truck   | 
| Smith | GM      | car     | 
| Smith | GM      | truck   | 
| Jones | Ford    | car     | 
-----------------------------

..。分成3个表格:

代码语言:javascript
复制
ac(agent, company)
cp(company, product)
ap(agent, product)

-------------------   ---------------------   ------------------- 
| AGENT | COMPANY |   | COMPANY | PRODUCT |   | AGENT | PRODUCT |
|-------+---------|   |---------+---------|   |-------+---------|
| Smith | Ford    |   | Ford    | car     |   | Smith | car     |
| Smith | GM      |   | Ford    | truck   |   | Smith | truck   |
| Jones | Ford    |   | GM      | car     |   | Jones | car     |
-------------------   | GM      | truck   |   -------------------
                      ---------------------

但我甚至不确定我是否理解上述规则的英语含义。我对上述规则的理解是,它的“然后”子句是完全多余的!为,

如果代理正在销售产品

如果这个代理代表一家生产该产品的公司,

,很明显,这个代理商正在为那家公司销售那个产品。

那么,这个声明中的“规则”在哪里呢?事实上,对我来说,这似乎是一种非陈述!

从三张表格-- ac、cp和ap --倒过来看,规则似乎是:“一个公司可以生产一个或更多的产品,一个代理商可以代表一个或更多的公司,当他代表一家公司时,他可能出售它的所有产品,也可以不销售它的所有产品。”

但是原始的acp表已经捕获了这个规则。所以,我不知道这是怎么回事,对5NF的解释。

现在让我们来看看参考文献#2 (Wikipedia)。

它说:然而,假设以下规则适用:“旅行销售员在他的曲目中有某些品牌和特定的产品类型。如果品牌B1和B2在他的曲目中,而产品类型P在他的曲目中,那么(假设B1品牌和品牌B2都制造产品类型P),旅行推销员必须提供产品类型为P型的产品--那些由品牌B1和由品牌B2制造的产品。”

再一次,按照这条规则的英文意思,

如果销售员有B1和B2品牌,还有产品P的话,

如果产品P是由B1和B2两种品牌生产的,

那么,为什么他不能提供B1和B2品牌的产品P,就像他在这个新的“规则”生效之前就能在原来的3列表“sbp(销售人员,品牌,产品)”中提供一样的东西?

谁能澄清一下?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-03 12:29:00

你看,向后看要容易得多。

首先, 5NF ;一个表(关系变量)在5NF中,如果分解它不会消除任何冗余。因此,就消除冗余而言,它是最终的NF。

原始表显然有一些冗余。它声称“史密斯代表福特”。两次,“史密斯代表通用。”两次。

让我们看看是否有可能将其分解成两个或更多的投影,并减少一些冗余。

我们从后面开始吧。

  • 公司存在。{COMPANY}
  • 探员存在。{AGENT}
  • 产品存在。{PRODUCT}
  • 公司生产产品。{COMPANY, PRODUCT}
  • 代理代表公司。{AGENT, COMPANY}

暂停一下;假设有一条规则是“如果一个代理代表一个公司,而该公司制造了一个产品,那么该代理就会出售该产品”。

这将是简单的{AGENT, COMPANY} JOIN {COMPANY, PRODUCT};但是这会产生一个额外的元组,即(Jones, Ford, truck);这不是真的,因为琼斯不卖卡车。

因此,并不是每个代理商都能销售每一种产品,因此有必要明确说明这一点。

  • 代理销售产品。{AGENT, PRODUCT}

如果我们加入

{AGENT, COMPANY} JOIN {COMPANY, PRODUCT} JOIN {AGENT, PRODUCT}

这个额外的元组被{AGENT, PRODUCT}的联接所消除。

为了直观地掌握事物,规则可以修改一点。

原始

如果代理销售某一产品,而他代表一家公司生产该产品,那么他就为该公司出售该产品。

修改的(同义)

如果代理销售产品,而代理代表公司,而公司生产该产品,那么代理将为该公司销售该产品。

解释了(从上面的要点代替)

如果{AGENT, PRODUCT}{AGENT, COMPANY}{COMPANY, PRODUCT},那么{AGENT, COMPANY, PRODUCT}

因此,这个规则允许连接发生--从而进行分解。

现在将其与原始表的谓词进行比较:

代理代表公司并销售公司生产的一些产品。

和规则不一样,所以可能会出现违反规则的异常现象--见比尔·卡温的例子。

编辑(见下面的注释)

假设有原始表,但不是规则

很明显,表中有一些冗余,所以我们可能想知道是否有办法消除这种冗余--通常的方法是分解成表格的投影。

因此,经过一些修改后,我们发现它可以分解为{AGENT, PRODUCT}, {AGENT, COMPANY}, {COMPANY, PRODUCT}。根据您的例子,当前的数据当然允许这样做。

当我们对“哪个代理商销售哪个公司的产品”感兴趣时,我们就这么做。答案很简单

{AGENT, COMPANY} JOIN {COMPANY, PRODUCT} JOIN {AGENT, PRODUCT}

然后本田出现了,他们也制造汽车和卡车。嗯,没有问题,只需将(Honda, truck) , (Honda, car)插入到{COMPANY, PRODUCT}中即可。

然后史密斯决定出售本田汽车,而不是卡车。抱歉,没门,哎呀!因为他已经卖汽车和卡车了,如果他想代表本田,他必须同时卖掉这两辆车。

因为我们会有元组

代码语言:javascript
复制
(Smith, Honda) (Honda, truck) (Smith, truck)
               (Honda, car)   (Smith, car)

所以我们让介绍了的规则!真的不想--只是想摆脱一些多余的东西。

现在的问题是,原来的数据集是偶然的,还是一条规则在DB之外强制执行的结果?

作者(肯特)声称该规则的存在和设计不匹配。当然,原始表只接受(Smith, Honda, car)不会有问题--不需要(Smith, Honda, truck)

理论点(如果无聊则忽略)

规则

If {AGENT, PRODUCT} and {AGENT, COMPANY} and {COMPANY, PRODUCT} then {AGENT, COMPANY, PRODUCT};对于每一个(Agent, Company, Product)三重奏。

显式声明连接依赖项

* { {AGENT, COMPANY}, {COMPANY, PRODUCT}, {AGENT, PRODUCT} }

保留原来的桌子。

正如人们常说的那样,这样的案例非常罕见,甚至连教科书上的例子也不得不引入奇怪的规则来解释基本的概念。

编辑II (有趣的部分,但可能有助于理解)

假设不存在这条规则,并且有明确的要求,任何代理商都可以从任何公司出售他想要的任何东西--因此这条规则是完全错误的。

在这种情况下,我们有原来的表。

{AGENT, COMPANY, PRODUCT}

我认为:

  1. 关键是,它在BCNF。
  2. 它不能被分解(当前的数据可能允许它,但是未来不允许)。
  3. 它是在BCNF中,所有的关键,它不能被分解,因此它是在5NF。
  4. 它是在5NF,是所有关键,因此它是在6NF。

因此,是规则的存在与否决定了表是在BCNF还是6NF -相同的表相同的数据中。

票数 28
EN

Stack Overflow用户

发布于 2013-08-03 07:42:10

所有正常形式都是为了避免异常,即数据中的逻辑不一致。

当你违反第五范式时,可能会有一种异常,用这种关系来表示:

代码语言:javascript
复制
-----------------------------
| AGENT | COMPANY | PRODUCT |
|-------+---------+---------|
| Smith | Ford    | car     | 
| Smith | Ford    | truck   | 
| Smith | GM      | car     | 
| Jones | Ford    | car     | 
| Jones | GM      | truck   | 
-----------------------------

我们知道琼斯为通用汽车和福特工作,我们知道琼斯销售汽车和卡车。我们(从史密斯那里)知道通用汽车制造汽车。那么为什么没有一排[Jones, GM, car]呢?这是异常现象。琼斯应该卖掉通用汽车,但这张桌子上没有任何东西能让这一切保持一致。

这些问题来自于试图用一个关系来表示多个独立事实。

如果我们将这些独立的事实表示为独立关系accpap,那么我们就排除了出现异常的可能性。

关于你的评论:

为了这个例子的目的,我们假设一个推销员有动机去推销他能做的任何事情。如果他能卖一种类型的汽车,他在一家公司工作,而公司生产这种类型的汽车,那么推销员肯定会卖它。

威廉·肯特的文章阐述了这一前提:

但假设有一条规则是有效的:如果代理商销售某一产品,而他代表一家公司生产该产品,那么他就为该公司出售该产品。

因此,基于这个前提,每一个可能的有效组合都应该导致三列表中的一行。这是我们希望数据能够满足的业务规则。

但是,如果我们的单个表不包含与该前提一致所需的行之一,则它无法表示业务规则。基本上,因为它引入了“事实”被冗余存储的可能性。

通过将事实分成三个表,每个事实被精确地存储一次。三个简单表之间连接的结果自然会产生一个类似于原始三列表的关系,除非保证没有异常。

票数 13
EN

Stack Overflow用户

发布于 2013-08-07 20:26:14

“如果代理商在销售产品

如果这个代理代表的是一家生产该产品的公司,

那么,很明显,这个代理商是在为那家公司出售那个产品。“

这完全是错误的。完全是这样。再想一想。

福特制造出租车。福特制造冰棍。通用汽车制造出租车。通用汽车制造冰棍。

我代表福特。我代表总经理。我卖出租车。我卖冰棍。

现在,在以下情况下,这8条语句是否都是正确的:

我卖出租车,但只卖福特那种。我卖冰棍,但只卖通用汽车。

答:是的,是的。

事实上,我代表福特的一些产品,我出售的一些制造商和福特制造的薄荷,这并不意味着我出售福特贝里克利。

编辑:进一步澄清并试图解决实际问题。5NF

acp设计在5NF中,不能(不能)分解的情况与非加太设计不是在5NF中,而且必须分解的情况之间的区别,恰恰在于是否有一条业务规则有效地“从逻辑上暗示我出售福特汽车”(坚持这个例子)。单凭逻辑并不能给我们这样的规则,但企业可以添加他们想要的所有规则。

如果这样一条规则有效,那么acp设计中的信息(“我卖福特汽车”)就会从其他设计中得到逻辑上的可衍生(不是凭借逻辑本身,而是通过应用规则),而必须选择另一种设计(选择记录逻辑上可衍生的信息构成冗余wrt -它可以派生的“基本”信息,因此构成对某些NF的违反)。

如果没有这样的规则生效,那么机场核心计划设计中的信息在逻辑上就不能从任何其他方面衍生出来,因此必须“单独”说明这些信息。没有这样的规则意味着没有可派生性/冗余,因此(说得相当松散和草率)没有违反NF。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18029821

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档