Database 不确定用于规范化的数据复制规则(特别是1NF和2NF)
由于难以回忆几周前我上过的一节课的细节,我正试图使用教程点系列来澄清规范化的过程。在其第页中,给出了以下示例:Database 不确定用于规范化的数据复制规则(特别是1NF和2NF),database,database-design,normalization,Database,Database Design,Normalization,由于难以回忆几周前我上过的一节课的细节,我正试图使用教程点系列来澄清规范化的过程。在其第页中,给出了以下示例: CREATE TABLE CUSTOMERS( CUST_ID INT NOT NULL, CUST_NAME VARCHAR (20) NOT NULL, ORDER_ID INT NOT NULL, ORDER_DETAIL VARCHAR (20) N
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中,“没有重复的数据组”。在2NF示例中,将存在重复的数据组。例如,如果一个客户订购了两件商品,他们的名字就会重复。这是否会破坏1NF?如果不是,原因是什么?1NF描述中的“重复组”指的是电子表格用户称之为“垂直合并单元格”的内容。另一种查看方式是行不能包含嵌套表。要将重复组转换为1NF,表中的每一行都有自己的相关值副本,这样我们就有了一个集合,而不是行的层次结构
相同值的多个实例在所有范式中都是完全可以接受的。一个常见的误解是,规范化意味着减少值的重复。相反,它旨在减少值之间关联的重复。回答您的问题,不会有任何重复的数据组。主键是(CUST_ID,ORDER_ID),对于每个新订单,至少ORDER_ID是唯一的。现在,还将存在一个单独的订单表。当客户订购两个项目时,我们将在此表中插入一个条目,并在订单表中插入另一个条目。这两个条目将具有相同的订单ID。但是,只有订单表将包含此订单中包含两个项目的信息 如果我们将两个项目的信息插入这个表本身,那么我们将有相同(CUST_ID,ORDER_ID)的重复组,这将违反2NF。但这不是我们更新表的方式
前三个NFs的规则如下- 1NF:只是说明所有列都必须具有原子值。如果列需要多个值,请创建另一个表 2NF:需要1NF限定,任何非关键字段都应依赖于整个主键 3NF:需要2NF资格,非关键字段不应依赖于任何其他非关键字段。这意味着除了主键之外,表的列之间不应该有依赖关系
我写了另一个这样的答案,也是关于。如果你写了以上三条规则,你就可以不再关心你在其他地方学到的关于这三条规则的任何东西。定义是完整的。在您的规则集中,您没有说明需要在1NF中设置主键。我看过一些关于这个的讨论。你能解释一下你为什么没有具体说明吗?@ScottPage:这完全是错的。主键是区分元组的关键。否则,冗余消除的全部目的将丢失。