我正在努力了解4NF,5NF及其区别。
这是我向不认识的人描述4 / 5NF(或如何描述实现它的步骤)的方式。我之所以这样说,是因为这将显示出我真正理解的内容。
通常,应通过为它们的可能组合使用联接表来实现N:N实体关系。如果存在3个或更多具有N:N关系的实体,则应仔细考虑:
E1)维基百科关于4NF的页面示例:https://en.wikipedia.org/wiki/Fourth_normal_form
我们有实体餐厅,比萨饼品种和送货区。我们可以用一个包括所有三个表的联接表来实现它们的多对多关系。但是,如果人们正确地考虑了数据,则这些三胞胎仅是2个N:N关系的产物:Restaurant:Pizza和Restaurant:Delivery Area。如果“ A1披萨”餐厅决定在其曲目中加入“薄皮”比萨饼品种,那么我要么在同一行的“ A1比萨饼”的所有送餐区中插入一行带有相同餐厅/比萨饼的品种, .redundant,或仅插入特定的送货地区,这会使4.感觉无效,因为没有一家商店会为送货地区提供较少的品种(或者至少可以说我们的规格是这样)。
E2)维基百科关于5NF的页面示例:https://en.wikipedia.org/wiki/Fifth_normal_form
我们有业务员,品牌和类型实体。我们可以用一个包括所有三个表的联接表来实现它们的多对多关系。但是,由于“遵循以下规则”部分,三元组实际上是3 N:N关系可用的(笛卡尔)乘积,因此,正确的方法是为其提供3个连接表。“请注意此设置如何帮助删除冗余。” 部分很像我的第四点。
当文章指出“还请注意该表位于4NF中”时,事实变得更加令人困惑,事实是,如果该表具有所有行,则应覆盖“以下规则”,然后它不会覆盖4NF!正确的?
所以.. E1和E2之间有什么区别,使其中一个成为4NF,而另一个成为5NF示例?
E1和E2有什么区别,使其中一个成为4NF,而另一个成为5NF示例?
非4NF和非5NF关系都显示由于JD引起的更新异常。4NF表示没有来自二进制JD的异常,而5NF表示没有来自任何Ard的JD的异常。Wikipedia示例对4NF的规范化摆脱了二进制JD的关系- 这种关系是一个有问题的2向联接。对5NF的规范化摆脱了3向JD的关系- 该关系是一个有问题的3向联接。(因为它始于4NF,所以它不可能有任何有问题的二进制JD。)
关系(值或变量)在5NF中时,可以以各种方式无损地分解(即分解为与之连接的投影)(即,对应的JD(连接依赖项)成立),则组件可以按某种顺序重新结合在一起,其中每个联接的公共列都是原始联接的超键。(费金的PJ / NF纸的成员资格的算法。)4NF的定义是不同的是仅方式相同,它可以无损地分解成 2个 突起事项(即相应JD为二进制数)(即,相应的MVD(多值依赖)成立)。
(这种具有这样的连接顺序的允许的JD被称为“由CK(候选关键字)表示”。)
这个想法是,如果我们可以分解成与原始连接的投影,那么我们应该这样做,除了超级键上的连接不会引起任何问题/异常。
当FD(功能依赖性)S-> A与属性集R保持关系时,该关系在SU {A}和R-{A}上可无损地分解。因此,JD {SU {A},R-{A}}成立,而MVDS->> {A}成立。
关系含义/谓词 另一方面,假设您 知道该关系的含义 ,以至于您知道该关系包含元组,这些元组从 (特征)谓词可 表示为其他并集的陈述中得出真实的陈述,例如 ticket Ticket was submitted by a person with first name Vname AND there is a person with name Vname Nname AND ticket Ticket was submitted by a person with last name Nname 设计Join的目的是使其输出谓词与输入谓词的与。因此,您将知道检查原始文件的任何对应分解是否满足JD(即,来自合词的关系是否是原始文件的投影),并因此检查原始文件的CK是否隐含了JD。 归一化到较高NF的要点是,当一个关系的谓词可以表示为其他关系的连接且它们的关系是原始关系的投影时,JD成立,因此我们可以改用更简单的分离关系,除非我们也可以使用JOIN /和成对共享CK的关系/谓词,因为仍然没有更新异常。(如果FD{x, ...} -> a成立,则某个MVD成立,某个二进制JD成立,并且该关系的谓词可以表示为... AND a = f(x, ...)。)
关系含义/谓词
另一方面,假设您 知道该关系的含义 ,以至于您知道该关系包含元组,这些元组从 (特征)谓词可 表示为其他并集的陈述中得出真实的陈述,例如
ticket Ticket was submitted by a person with first name Vname AND there is a person with name Vname Nname AND ticket Ticket was submitted by a person with last name Nname
设计Join的目的是使其输出谓词与输入谓词的与。因此,您将知道检查原始文件的任何对应分解是否满足JD(即,来自合词的关系是否是原始文件的投影),并因此检查原始文件的CK是否隐含了JD。
归一化到较高NF的要点是,当一个关系的谓词可以表示为其他关系的连接且它们的关系是原始关系的投影时,JD成立,因此我们可以改用更简单的分离关系,除非我们也可以使用JOIN /和成对共享CK的关系/谓词,因为仍然没有更新异常。(如果FD{x, ...} -> a成立,则某个MVD成立,某个二进制JD成立,并且该关系的谓词可以表示为... AND a = f(x, ...)。)
{x, ...} -> a
... AND a = f(x, ...)