不确定规范化的数据复制规则(特别是 1NF 和 2NF)

Uncertain on data duplication rules for normalisation (specifically 1NF and 2NF)

由于难以回忆几周前上过的一节课的细节,我正在尝试使用 TutorialPoint 系列来阐明规范化的过程。在 2NF 的页面中,它给出了以下示例:

CREATE TABLE CUSTOMERS(
       CUST_ID    INT              NOT NULL,
       CUST_NAME VARCHAR (20)      NOT NULL,
       ORDER_ID   INT              NOT NULL,
       ORDER_DETAIL VARCHAR (20)  NOT NULL,
       SALE_DATE  DATETIME,
       PRIMARY KEY (CUST_ID, ORDER_ID)
);

它声明这是在 1NF 中,但是在它的 1NF 页面中它声明为了在 1NF "there are no repeating groups of data" 中。在 2NF 示例中,会有重复的数据组。例如,如果客户订购了两件商品,则他们的名字会重复。这不会破坏 1NF 吗?如果没有,为什么?

"Repeating groups" 在 1NF 的描述中指的是电子表格用户所说的 "vertically merged cells"。另一种查看方式是行可能不包含嵌套的 table。要将重复组转换为 1NF,table 中的每一行都会获得相关值的副本,以便我们拥有一个集合而不是行的层次结构。

相同值的多个实例完全可以接受table所有正常形式。一个常见的误解是规范化是为了减少值的重复。相反,它旨在减少值之间关联的重复。

回答你的问题,不会有任何重复的数据组。主键是 (CUST_ID, ORDER_ID) 并且对于每个新订单,至少 ORDER_ID 是唯一的。现在,还会有一个单独的订单 table。当客户订购两件商品时,我们将在此 table 中插入一个条目,在订单 table 中插入另一个条目。两个条目将具有相同的 ORDER_ID。但是,只有订单 table 会包含此订单中包含两个项目的信息。

如果我们将两个项目的信息插入此 table 本身,那么我们将有相同的重复组 (CUST_ID, ORDER_ID),这将违反 2NF。但这不是我们更新 tables 的方式。


前三个NF的规则如下-

1NF: 只是声明所有列都必须具有原子值。如果一列需要多个值,请创建另一个 table.

2NF:需要1NF限定,任何非键字段都应该依赖于整个主键。

3NF: 需要 2NF 资格,并且任何非关键字段都不应依赖于任何其他非关键字段。这意味着 table 的列之间应该没有依赖关系,除了主键。

我写了另一个这样的答案,也是关于Normalization in Database。如果你掌握了上面写的三个规则,你就可以不再关心你在其他任何地方学到的关于这三个规则的任何其他内容。定义完成。