由于努力回忆几周前的课程细节,我正在尝试使用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中“没有重复的数据组”。在2NF示例中,将存在重复的数据组。例如,如果客户订购了两个商品,则会重复其名称。这不会打破1NF,如果不是为什么?
答案 0 :(得分:0)
所有正常形式都可以完全接受相同值的多个实例。这种常见的误解是规范化意味着减少价值重复。相反,它意味着减少值之间的关联重复。
答案 1 :(得分:0)
要回答您的问题,不会有任何重复的数据组。主键是(CUST_ID,ORDER_ID),对于每个新订单,至少ORDER_ID将是唯一的。现在,还会有一个单独的Order表。当客户订购两个商品时,我们将在此表中插入一个条目,在Order表中插入另一个条目。两个条目都具有相同的ORDER_ID。但是,只有Order表将包含此订单中包含两个项目的信息。
如果我们将两个项目的信息插入此表本身,那么我们将重复具有相同的组(CUST_ID,ORDER_ID)并且违反2NF。但这不是我们更新表格的方式。
前三个NF的规则如下 -
1NF:只是声明所有列都必须具有原子值。如果列需要多个值,请创建另一个表。
2NF:需要1NF资格,并且任何非关键字段都应该依赖于整个主键。
3NF:需要2NF资格,并且任何非关键字段都不应取决于任何其他非关键字段。这意味着除了主键之外,表的列之间不应存在依赖关系。
我写了另一个这样的答案,也是Normalization in Database。如果你得到上面写的三条规则,你可以停止关心你在其他地方学到的关于这三条规则的任何其他事情。定义完整。