【问题标题】:How to understand the 5th Normal Form?如何理解第五范式?
【发布时间】:2013-08-03 05:54:39
【问题描述】:

我使用两个在线资源来了解 5NF,没有任何严格的数学和证明。

  1. A Simple Guide to Five Normal Forms in Relational Database Theory(由 Kent 撰写。这一篇似乎在他的一篇著作中得到了 CJ Date 本人的审查和认可)
  2. Fifth Normal Form(维基百科文章)

但是,我无法理解这些参考文献中的任何一个!

让我们首先检查参考文献 #1(Kent 的)。

它说:“但是假设某条规则生效:如果代理销售某种产品​​,并且他代表一家生产该产品的公司,那么他为该公司销售该产品。”

然后,继续分解原始表(所有表名都由我给出)...

acp(agent, company, product)

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

...分成3个表:

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   |   -------------------
                      ---------------------

但我什至不确定我是否理解上述规则的英语含义。我对上述规则的理解是,它的 'then' 子句完全是多余的!对于,

如果代理商正在销售产品

如果此代理代表生产该产品的公司,

那么,很明显,该代理正在为该公司销售该产品。

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

从三个表(ac、cp 和 ap)向后推算,规则似乎真的是:“一家公司可能生产 1 种或更多产品,代理可能代表 1 或更多公司,而当代表一家公司,他可能会也可能不会销售其所有产品。”

但原始表 acp 已经捕获了此规则。所以,我不确定 5NF 的解释是怎么回事。

现在让我们看看参考文献 #2(维基百科)。

它说:但是,假设以下规则适用:“一个旅行推销员在他的曲目中具有某些品牌和某些产品类型。如果品牌 B1 和品牌 B2 在他的曲目中,并且产品类型 P 是那么,在他的曲目中(假设品牌 B1 和品牌 B2 都生产 P 型产品),旅行推销员必须提供由品牌 B1 和 B2 品牌生产的 P 型产品。”

再一次,按照这条规则的英语含义,别无其他,

如果一位推销员拥有品牌 B1 和 B2,以及他的产品 P,

如果产品 P 由 B1 和 B2 品牌制造,

那么,他到底为什么不能像原来的三列表'sbp(salesman, brand, product)那样提供品牌B1和B2的产品P ' 甚至在这个新的'规则'生效之前就已经很好地服务了?

有人可以澄清一下吗?

【问题讨论】:

  • 它应该是“他为该公司销售该产品”。主键不能只是(公司,产品)吗?这将执行规则。
  • 不,当您输入“only”时,它就变成了一个完全不同的问题。我想,我终于开始了解规则是什么,因此 5NF 是什么。我相信,无法理解规则是我的问题。谢谢,无论如何。
  • “显然”是错误的。一般而言,“如果代理商正在销售产品并且 [] 该代理商代表制造该产品的公司”,那么“该代理商正在为该公司销售该产品”可能是也可能不是这种情况;他们可能只将其出售给其他公司。但是他们必须为那家公司出售它当有一个规则时,如果...那么...。因此,给定的企业可能有也可能没有该规则。 PS if x then y == (not x) or y 所以当有一个规则是,要么不是 (...) 要么 ...

标签: database-design relational-database database-normalization


【解决方案1】:

你看,倒过来就容易理解了。

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

原表显然有一些冗余。它声称 “Smith 代表福特。” 两次,“Smith 代表 GM。” 两次。

所以让我们看看是否有可能将其分解为两个或多个投影并减少一些冗余。

让我们从后面开始。

  • 公司存在。 {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}

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

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

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

与规则不同,因此它对违反规则的异常情况开放 - 请参阅 Bill Karwin 的示例。


编辑(见下面的 cmets)

假设我们有原始表格,但没有规则

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

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

我们会这样做,并且只要对“哪个代理商销售哪个公司的哪个产品?”感兴趣,答案很简单

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

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

然后史密斯决定出售本田汽车,而不是卡车。对不起,没办法,哎呀!因为他已经卖汽车和卡车了,如果他想代表本田,他必须同时卖。

因为我们会有元组

(Smith, Honda) (Honda, truck) (Smith, truck)
               (Honda, car)   (Smith, car)

所以我们引入了规则!真的不想——只是想摆脱一些冗余。

现在的问题是,原始数据集只是侥幸,还是在数据库之外以某种方式强制执行的规则的结果?

作者 (Kent) 声称该规则存在并且设计与它不匹配。当然,原始表只接受(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} }

保留原始表格。


正如人们常说的,这种情况很少见;实际上如此罕见,以至于即使是教科书示例也必须引入奇怪的规则才能解释基本思想。


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

假设该规则不存在,并且明确要求任何代理人可以从任何公司出售他想要的任何东西——因此该规则将是完全错误的。

在这种情况下,我们有原始表

{AGENT, COMPANY, PRODUCT}

我认为:

  1. 作为全键,它在 BCNF 中。

  2. 无法分解(当前数据可能允许,但未来不允许)。

  3. 在BCNF中,全是key,不能分解,所以在5NF中。

  4. 它在 5NF 中并且是全键的,因此它在 6NF 中。

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

【讨论】:

  • 达米尔,我理解你的反应直到 “所以,规则允许连接发生......”。这是一个非常漂亮和独特的演示文稿,我以前从未在任何数据库文本中遇到过 - 所以,谢谢你。但是,您能否澄清您的回复文本,其中包括并遵循这一行(我在此评论中引用过)? +1。
  • @Harry,好的;但现在必须出差,所以这个周末我有时会扩展一下。
  • 谢谢,达米尔。同时,我也对 Bill Karnin 的回复发表了评论。
  • 感谢@Damir 的解释。我参考了 Kent 的相关文章、Thomas Connolly 和 Carolyn Beg 的 Wikipedia 和数据库系统,但我发现您的解释简直太棒了!最后,规则是规则第五范式!
  • @Damir 漂亮的解释!非常感谢!
【解决方案2】:

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

当你违反第五范式时,可能会出现异常,由以下关系表示:

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

所以我们知道琼斯为通用汽车和福特工作,我们知道琼斯销售汽车和卡车。我们(从史密斯那里)知道通用汽车制造汽车。那么为什么[Jones, GM, car] 没有一行呢?这是一个反常现象。琼斯 应该 销售 GM 汽车,但此表中没有任何内容可以保持一致。

问题在于试图使用一种关系来表示多个独立的事实。
如果我们将这些独立事实表示为独立关系accpap,那么我们就消除了异常的可能性。


你的评论:

在本示例中,我们假设推销员有动力去销售他能销售的任何东西。如果他可以销售一种类型的车辆,并且他在一家公司工作,并且该公司生产这种类型的车辆,那么销售人员肯定会出售它。

William Kent 的文章中陈述了这个前提:

但假设某条规则生效:如果代理商销售某种产品​​,并且他代表一家生产该产品的公司,那么他为该公司销售该产品。

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

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

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

【讨论】:

  • 比尔,你为什么说,“琼斯应该卖通用汽车……”?规则在哪里规定代表公司的所有代理商都必须为该公司销售所有产品?您的示例关系只是呼应了我一直在想的对规则的解释。即,代表公司的代理只能销售该公司生产的部分产品,而不是所有产品。我仍然觉得要么在关系数据中,要么在说明 5NF 的规则本身的陈述中缺少一些东西。
  • Bill,尽管您的回答很有启发性(与本论坛上的许多其他人一样),但我真的很想将 Damir 的回答标记为“最终”。我希望这对你来说没问题。 (遗憾的是,没有办法将多个答案标记为“最终”,这对我来说是一个良心刺痛的时刻。)
  • @Harry,感谢您的评论。别往心里放。 :-) 对我来说重要的是我们在 StackOverflow 上分享了很好的信息。分数是次要的。
  • @Bill Karwin 你的一句粗体字让我在经过几个小时的繁琐搜索后终于意识到了5NF,谢谢!
  • @GeorgeMenoutis,很高兴它为您点击到位!我还发现 4NF 更容易理解。我上面的粗体句子以不同的方式适用于 4NF 和 5NF。
【解决方案3】:

“如果代理商正在销售产品

如果此代理代表生产该产品的公司,

那么,很明显,该代理正在为该公司销售该产品。 "

这是完全错误的。完全。再想想吧。

福特制造出租车。 福特制造自行车。 通用汽车制造出租车。 通用汽车制造自行车。

我代表福特。 我代表通用汽车。 我卖出租车。 我卖自行车。

现在,在以下情况下,这 8 条陈述是否都正确:

我卖出租车,但只卖福特那种。 我卖自行车,但只卖 GM 那种。

答案:是的。

我代表福特销售某些产品,我为某些制造商销售自行车,而福特制造自行车,这在逻辑上并不意味着我销售福特自行车。

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

acp 设计在 5NF 中且不能(不能)分解的情况与 ACP 设计不在 5NF 中且必须分解的情况之间的区别,恰恰在于是否存在BUSINESS 规则实际上是 DOES“在逻辑上暗示我出售福特自行车”(继续举例)。 单独的逻辑并没有给我们这样的规则,但企业可以添加他们想要的所有规则。

如果这样的规则是有效的,那么 acp 设计中的信息(“我卖福特自行车”)在逻辑上确实变得可推导(不是仅仅凭借逻辑而是凭借规则应用)从另一个设计,并且必须选择另一个设计(选择记录逻辑上可导出的信息构成了可导出的“基本”信息的冗余,因此构成对某些NF的违反)。

如果没有这样的规则生效,那么 acp 设计中的信息在逻辑上不能从其他任何东西推导出来,那么必须声明的信息就是“个别”。没有这样的规则意味着没有可推导/冗余,因此(说得松散和草率)没有违反 NF。

【讨论】:

  • 是的,你说的有道理现在,不知道为什么不早点! +1。
  • 尽管您所说的帮助我理解了其他 2 个答案,但遗憾的是,无法将多个答案标记为“最终”。我希望,朋友,如果我将 Damir 标记为 final,你会没事的。这对我来说是一个真正的良心刺痛时刻!
猜你喜欢
  • 1970-01-01
  • 2015-04-14
  • 2015-02-05
  • 2014-05-22
  • 2012-01-03
  • 2015-04-28
  • 1970-01-01
  • 2016-10-31
  • 2015-09-16
相关资源
最近更新 更多