代码之家  ›  专栏  ›  技术社区  ›  Otávio Décio

这违反了什么样的规范化规则?

  •  10
  • Otávio Décio  · 技术社区  · 14 年前

    假设我在一个数据库中有两个表,t t 十一 ,分别有10列和11列,其中10列在两列上完全相同。

    我违反了什么(如果有的话)规范化规则?

    8 回复  |  直到 9 年前
        1
  •  8
  •   Alison R.    12 年前

    编辑:我被告知在理论上没有违反任何正常形式。因为这是公认的答案,所以我把它放在这里作为参考,因为在实践中考虑3nF可能有助于避免类似问题中的情况。

    你违反了 Third Normal Form (3NF) ,因为如果两个表中的数据基本相同,那么每个表的每个属性都不直接依赖于其各自表的键。

        2
  •  6
  •   outis    12 年前

    信不信由你,跨表复制列本身并没有违反任何理论上的正常形式。除了域/键标准形式(dknf),标准形式是以单个而不是多个表的形式定义的。dknf是根据约束定义的,一般情况下没有约束。因此,如果违反了正常形式:

    • 它必须特定于其中一个表,并且独立于两个表而存在(即,即使删除了另一个表,该表仍将违反正常形式),或者
    • 这种关系有一个违反dknf的约束,这意味着它不是问题中概述的一般情况的例子,而是更具体的情况。创建冲突的不是重复列,而是额外列上的附加约束。

    考虑 normal forms ,使用维基百科文章中的简短定义:

    1NF
    该表忠实地表示一个关系,没有重复组。

    这个相当直截了当。术语“重复组”在理论上有多种含义,但它们都与重复的列或数据无关。

    2NF
    表中的非素数属性在功能上不依赖于任何候选键的适当子集。

    这里,要检查的重要术语是“功能依赖性”。从本质上讲,函数依赖性是指将一个关系投影到两列(x和y)上,最后得到一个函数x→y。在两个(或更多)表之间不能有函数依赖性。 * . 此外,候选键不能跨越多个表。

    3NF
    每个非素数属性都不可传递地依赖于表中的每个候选键。

    传递依赖是根据功能依赖来定义的:传递依赖是一种依赖,其中x→z只是因为x→y和y→z。x、y和z必须在同一个表中,因为它们是功能依赖。

    4NF
    表中的每个重要的多值依赖项都是对超键的依赖。

    Multivalued dependency 有点棘手,但可以用一个例子来说明:“每当元组(a,b,c)和(a,d,e)存在于r中时,元组(a,b,e)和(a,d,c)也应该存在于r中”(其中“r”是一个表)。最重要的是,对于手头的事情,多值依赖只适用于一个表。

    5NF
    表中的每个重要联接依赖项都由表的超键表示。

    一张桌子有一张桌子 join dependency 如果它可以表示为其他表的自然联接。但是,这些其他表不需要存在于数据库中。如果表T 11个 在这个例子中有一个连接依赖项,即使删除了表T,它仍然有一个。

    6NF (C. Date)
    表完全没有重要的连接依赖项(参考通用连接运算符)。

    同样的5nF推理。

    初等键正规形式 (EKNF)
    表中每一个重要的函数依赖项要么是基本键属性的依赖项,要么是对超级键的依赖。

    2nF的推理相同。

    Boyce_ (BCNF)
    表中的每个重要的函数依赖项都是对超键的依赖。

    2nF的推理相同。

    域/密钥正常形式 (DKNF)
    表上的每个约束都是表的域约束和键约束的逻辑结果。

    如果t 十一 有一个依赖于t的约束 ,那么它要么是键约束,要么是更复杂的约束,仍然引用T。 . 后一种情况不是问题中提到的一般情况。换句话说,虽然可能存在具有违反DKNF的重复列的特定模式,但通常情况下这不是真的。此外,是根据多个表定义的约束(而不是正常形式),以及导致DKNF冲突的约束(而不是列重复)。


    标准化的目的包括防止异常。然而,规范化并不是完全的,因为它不能保证关系数据库完全没有异常。这是实践偏离理论的一个例子。

    如果这仍然不能让您信服,请考虑模式KM的注释提示,其中 十一 表示t的历史(或版本)版本 .t的主键 十一 由与T相同的主键列组成 ,再加上额外的列(日期/版本列)。那t 十一 具有不同的候选键使得异常倾向和无异常、规范化设计之间的所有区别。

    * 有人可能认为可以使用联接在两个表之间创建依赖关系。虽然一个联接可能会创建一个具有依赖关系的表,但是该依赖关系存在于该表上,而不是在联接的组成部分之间。在现有的情况下,这再次意味着其中一个表将是联接表,并且将遭受依赖关系本身的影响,而与数据库中的其他表无关。

        3
  •  4
  •   Ta01    14 年前

    也许避免冗余数据的规则?(即 相同的 两个表中的数据)

        4
  •  4
  •   GSto    14 年前

    如果11列中的10列相同,为什么不能仅是一个表,其中第11列为空(以及可能的第12列来表示它是哪种类型的数据,即它本来应该在哪个表中)?

        5
  •  4
  •   Larry Lustig    14 年前

    这要看桌子上有什么。

    如果没有相互关联的记录(例如,如果一个表只是源于第一个表但从第一个表中删除的存档记录),则不会违反任何规则。

    但如果每个表中的记录相同,则存在依赖性问题,第11列只依赖于记录中的键值,而不是附加列。假设所有十列都不涉及主键,那么就违反了第三个nf。

        6
  •  3
  •   nvogel    9 年前

    有两个相同或接近相同的关系本身并不违背任何通常的正常形式。outis已经很全面地解释了原因。很可能违反了 Principle of Orthogonal Design 然而,这是关系数据库设计理论的另一个方面。

        7
  •  0
  •   DVK    14 年前

    如果所有10列都是键的一部分,那么第二种正常形式是:消除冗余数据。具体来说,这属于“无障碍与代理主键”的两难境地——老实说,我不记得这两个选择中的任何一个是“违反”2nf,但代理键肯定更接近2nf的精神。

        8
  •  0
  •   Jonathan Czitkovics    14 年前

    只有主键在表之间可以是冗余的。在多个表中有任意数量的非主键列违反了第三种正常形式。