代码之家  ›  专栏  ›  技术社区  ›  George Menoutis

正常形式:4对5

  •  -2
  • George Menoutis  · 技术社区  · 6 年前

    我正在努力理解4nF、5nF及其区别。

    下面是我将如何向不知道的人描述4/5nF(或者,我将如何描述实现它的步骤)。我这么说是因为这将显示我真正理解的东西。

    通常,n:n实体关系应该通过为其可能的组合创建一个联接表来实现。如果有3个或3个以上的实体与n:n关系相关,则应仔细考虑:

    1. 更一般(包括)的解决方案是实现一个联接表,其中包含作为字段的所有实体,以及作为值(行)的所有实体组合。
    2. 但是,如果这些实体的关系不是真正的 每满元组的情况,而是(某些)的(笛卡尔)积 他们的二元n:n关系,然后仔细考虑最小值 需要两个字段表的数量。
    3. 一般化2,总是倾向于(当然,如果它是正确的)使用字段尽可能少的联接表。而且,如果没有任何用处,就不要创建联接表。
    4. 区分以上内容的一个有用提示是,当插入完成时,如果你的心脏!!)告诉你做的是多余的或无效的事情,然后你应该选择后面的方法之一。

    e1)维基百科4nf页面示例: https://en.wikipedia.org/wiki/Fourth_normal_form

    我们有实体餐厅、披萨品种和送货区。我们可以通过一个联接表实现它们的多对多关系,包括所有三个联接表。然而,如果我们正确地考虑数据,这些三联体仅仅是2个n:n关系的产物:餐厅:比萨饼和餐厅:送货区。如果“A1披萨”餐厅决定将“薄皮”披萨品种纳入其节目表,那么我必须将同一种餐厅/披萨品种的一行插入到“A1披萨”的所有交付区域,这将感觉到4.冗余,或者只插入到特定的交付区域,这将感觉到4.无效,因为没有一家商店能为送货区提供较少的品种(或者至少,我们的规范是这样说的)。

    e2)维基百科第5页示例: https://en.wikipedia.org/wiki/Fifth_normal_form

    我们有实体销售员、品牌和类型。我们可以通过一个联接表实现它们的多对多关系,包括所有三个联接表。但是,由于“以下规则适用”部分,三联体实际上是可用的3n:n关系的(笛卡尔)积,因此,正确的方法是为它设置3个联接表。“注意这个设置是如何帮助消除冗余的。”这部分与我的第4点非常相似。

    这种情况更让人困惑的是,尽管本文声明“还要注意表是4nf的”,但事实是,如果表中有所有的行,那么它就不会覆盖4nf!对吗?

    所以…什么是 e1和e2之间的差异,使得其中一个为4nF,而 其他5nF示例?

    3 回复  |  直到 6 年前
        1
  •  2
  •   philipxy    6 年前

    e1和e2的区别是什么?e1和e2中的一个是4nF,另一个是5nF示例?

    非4nf&non-5nf关系由于jds而出现更新异常;4nf表示二进制jds&5nf没有异常,表示任何arity的jds没有异常。维基百科的4nf规范化示例去掉了二进制jd——这种关系是一个有问题的双向连接。对5nf的规范化消除了一个3路JD——这种关系是一个有问题的3路连接。(因为它是在4nf中启动的,所以它不可能有任何问题的二进制JD。)


    关系(值或变量)在5nf中,当它可以以各种方式无损分解(即转换为连接回它的投影)(即相应的jd(连接依赖项)保持)时,组件可以以某种顺序连接回,其中每个连接的公共列是原始连接的超键。(法金的pj/nf纸的成员算法)4nf的定义是相同的,除了它可以无损分解为 预测很重要(即对应的JD是二进制的)(即对应的MVD(多值依赖关系)持有)。

    (这种允许的JD具有这样的连接序列被称为“由CKS(候选密钥)隐含的”)。

    我们的想法是,如果我们能够分解成连接回原始的投影,那么我们应该这样做,除非超键上的连接不会导致任何问题/异常。

    当fd(函数依赖项)s->a与属性集r保持关系时,该关系可以在s u a&r-a上无损分解。所以JD S U A,R A Holds&MVD S->A Holds。

    Which highest normal form is this table in?

    关系意义/谓词

    另一方面,假设你 知道关系的意义 到 你知道它包含了构成一个真实陈述的元组 从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(即 连词的关系是否是 原件),以便检查JD是否由原件的 CKS。

    对于更高的NFS,标准化的要点是当 关系的谓词可以表示为其他谓词和 他们的关系是对原始的投影,所以我们可以使用 相反,更简单的分离关系,除了我们可以加入/和 成对共享的ck上的关系/谓词,因为 仍然没有更新异常。(如果FD) {x, ...} -> a 持有然后确定 MVD持有特定的二进制JD持有和 关系可以表示为 ... AND a = f(x, ...) )

        2
  •  1
  •   nvogel    6 年前

    区别并不重要,因为4NF本身并不重要,除非您对数据库设计理论的历史感兴趣。

    5nf要求表满足的每个连接依赖项(jd)必须由该表的超级键隐含。4NF只涉及多值依赖(MVD)的概念,但由于MVD总是意味着存在相应的JD,因此根本不需要关注4NF。4nF的存在的历史原因是它碰巧是先被发明的,然后被5nF有效地取代,就像3nF被eknf/bcnf取代一样。

        3
  •  0
  •   Erwin Smout    6 年前

    这里还有一个问题需要澄清5nF的性质,它还有一个更实际的例子需要参考: How to understand the 5th Normal Form? . 把这里给出的更抽象的答案放在另一个问题的“实际案例”旁边可能会有所帮助。