【发布时间】:2018-11-02 10:00:41
【问题描述】:
我很难理解 4NF、5NF 及其区别。
这是我向不知道的人描述 4/5NF 的方式(或者,我将如何描述实现它的步骤)。我之所以这么说,是因为这将显示我真正理解的内容。
通常,N:N 实体关系应通过为它们的可能组合创建一个连接表来实现。如果有 3 个或更多实体与 N:N 关系相关,则应仔细考虑:
- 更通用(包括)的解决方案是实现一个连接表,其中包含所有实体作为字段,并将它们的所有组合作为值(行)
- 但是,如果这些实体之间的关系不是真正的 per-full-tuple case,而是(一些)的(笛卡尔)乘积 他们的二元 N:N 关系,然后仔细考虑最小 需要的双字段表的数量。
- 概括 2,总是更喜欢(当然,如果它是正确的)具有尽可能少的字段的连接表。显然,不要创建无用的连接表。
- 区分上述情况的一个有用提示是,当插入完成时,如果您的心 (!) 告诉您正在做多余或无效的事情,那么您应该选择后面的方法之一。
E1) 维基百科关于 4NF 的页面示例: https://en.wikipedia.org/wiki/Fourth_normal_form
我们有实体餐厅、披萨品种和送货区。我们可以用一个包含所有三个的连接表来实现它们的多对多关系。但是,如果对数据的看法正确,这些三元组仅是 2 个 N:N 关系的乘积:餐厅:比萨和餐厅:外卖区。如果“A1 Pizza”餐厅决定将“Thin Crust”Pizza Variety 添加到其曲目中,那么我必须在“A1 Pizza”的所有交付区域插入一排具有相同餐厅/披萨品种的披萨,这会让人感觉 4 .redundant,或者只插入特定的送货区域,这会让人感觉 4.invalid,因为没有商店会为送货区域提供更少的品种(或者至少,假设我们的规范是这样说的)。
E2) 维基百科关于 5NF 的页面示例: https://en.wikipedia.org/wiki/Fifth_normal_form
我们有实体 Salesman、Brand 和 Type。我们可以用一个包含所有三个的连接表来实现它们的多对多关系。但是,由于“适用以下规则”部分,三元组实际上是可用的 3 个 N:N 关系的(笛卡尔)乘积,因此,正确的方法是为其设置 3 个连接表。 “请注意此设置如何帮助消除冗余。”部分很像我的第 4 点。
这种情况更加令人困惑,因为虽然文章指出“还要注意该表处于 4NF 中”,但事实是,如果该表包含所有行,那么它应该涵盖“以下规则” ",那么它就不会涵盖 4NF!对吧?
所以.. 什么是 E1 和 E2 之间的区别使得其中一个成为 4NF 和 其他5NF示例?
【问题讨论】:
-
阅读我对stackoverflow.com/questions/7083699/… 的回答,了解违反 4NF 如何导致问题的示例。
-
@philipxy 首先,这不是功课。公式部分只是我试图要求基于示例的答案。其次,我认为我在试图理解差异方面所花费的时间确实保证了我有权提出一些问题。每个问题都可以通过阅读足够的书籍来回答,为什么会有这么多呢?关于多个问题,Q1 和 Q3 实际上更像是一个陈述,我知道我可能不理解,但只是表明我的努力。然后我会进行编辑,谢谢你的那部分。
-
家庭作业链接仍然是合适的。并非所有问题都是 SO 的主题。很少有事情是通过例子来解释的;一个例子说明了一个解释。如果没有 FD、CK、投影和连接,您将无法理解 NF,并且放入 NF 的算法使用这些。不幸的是,正如我所说,您正试图通过不相关的概念来理解,这些概念并未在您应该阅读的教科书中使用。例如,wiki 文章虽然很差,但仍然是正确的。参考一些关于 NF 定义或算法的学术介绍,并询问您遇到的问题。
-
请编辑更清楚。例如:“感觉”是什么意思?还是“覆盖”规则或“不覆盖”NF?这些例子有什么“令人困惑”的地方?另外:那些不是“产品”;尽管它们是(自然的)连接。您的意思是“三元组是” 的元素。 “没有商店”应该是“一些商店”吗?您将关系(船舶)基数与 arity 混淆了。您将 n 元关系(ship)的概念与多个二元关系(ship)的概念混淆了。 PS
标签: sql database database-design relational-database database-normalization