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

Otá*_*cio 10 relational-database 3nf database-normalization functional-dependencies

假设我在数据库上有两个表,T 10和T 11,分别有10和11列,其中10列在两者上完全相同.

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

Ali*_* R. 8

编辑:我被告知理论上没有违反正常形式.由于这是接受的答案,我将其留在这里作为参考,因为考虑3NF可能在实践中有助于避免问题中的情况.

您违反了第三范式(3NF),因为如果两个表中都保存了大部分相同的数据,则每个表的每个属性都不直接依赖于其各自表的键.

  • @AlisonR:请你扩展一下吗?根据我对3NF(实际上是任何正常形式)的理解,它仅适用于同一关系中的属性,因此在同一数据库中同时使用这两个表不会影响每个表是否在3NF中. (2认同)
  • @AlisonR。没有违反任何NF。该设计可能出现在5NF甚至6NF表中。我想您正在谈论的是“通过分解进行归一化”,这只是在某些给定的NF中完成设计的一个过程。分解不是唯一的方法,也不是规范化理论的要求。合成是一种选择。 (2认同)

out*_*tis 6

信不信由你,在表格中复制列不会违反任何理论上的正常形式.除域/密钥正常形式(DKNF)外,普通表单是根据个别而非多个表定义的.DKNF是根据约束来定义的,在一般情况下没有约束.因此,如果违反了正常形式:

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

使用维基百科文章中的简要定义考虑正常形式:

1NF
该表忠实地代表了一种关系,没有重复的群体.

这个很直接.术语"重复组"在理论中具有多重含义,但它们都与重复的列或数据无关.

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

在这里,要检查的重要术语是"功能依赖".本质上,函数依赖是指将关系投影到两列X和Y,然后使用函数X→Y结束.您不能在两个(或更多)表*之间具有函数依赖关系.此外,候选键不能跨越多个表.

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

传递依赖性是根据函数依赖性定义的:传递依赖性是一种依赖性,其中X→Z仅因为X→Y和Y→Z.X,Y和Z必须在同一个表中,因为它们是函数依赖性.

4NF
表中的每个非平凡的多值依赖都是对超级密钥的依赖.

多值依赖有点棘手,但可以用一个例子来说明:"只要元组(a,b,c)和(a,d,e)存在于r中,元组(a,b,e)和( a,d,c)也应该存在于r"(其中"r"是表)中.最重要的是,对于手头的问题,多值依赖只适用于单个表.

5NF
表中的超级键隐含表中的每个非平凡连接依赖项.

如果表可以表示为其他表的自然连接,则表具有连接依赖关系.但是,这些其他表不需要存在于数据库中.如果示例中的表T 11具有连接依赖关系,即使您删除了表T 10,它仍然会有一个连接依赖关系

6NF(日期)
表没有任何非平凡的连接依赖性(参考通用连接运算符).

与5NF相同的推理.

基本关键范式(EKNF)
表中的每个非平凡的函数依赖性是基本键属性的依赖性或对超级键的依赖性.

2NF的推理相同.

Boyce-Codd Normal Form(BCNF)
表中的每个非平凡的函数依赖都是对超级键的依赖.

2NF的推理相同.

域/密钥范式(DKNF)
表上的每个约束都是表的域约束和键约束的逻辑结果.

如果T 11具有取决于T 10的约束,则它是关键约束或仍然引用T 10的更复杂约束.后一种情况不是问题中提到的一般情况.换句话说,虽然可能存在具有违反DKNF的重复列的特定模式,但一般情况下并非如此.此外,它是根据多个表定义的约束(不是正常形式)和导致DKNF违规的约束(而不是列重复).


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

如果这仍然不能说服你,请考虑模式KM.的评论提示,其中T 11表示T 10的历史(或版本化)版本.T 11的主键由与T 10共同保存的主键列以及额外列(日期/版本列)组成.是t 11有不同的候选键使所有异常倾向和异常免费的,标准化的设计之间的差异.

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