数据库 - 第二范式 (2NF)



第二范式规定它必须满足第一范式的所有规则,并且任何列都不能部分依赖于主键。

考虑一个客户订单关系,你想存储客户 ID、客户姓名、订单 ID、订单详情和购买日期。

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)
);

此表符合第一范式;因为它遵循第一范式的所有规则。在此表中,主键由 CUST_ID 和 ORDER_ID 组成。假设同一个客户不太可能订购相同的东西,因此两者组合是唯一的。

但是,该表不符合第二范式,因为主键和列之间存在部分依赖关系。CUST_NAME 依赖于 CUST_ID,并且客户姓名与他购买的产品之间没有真正的联系。订单详情和购买日期也依赖于 ORDER_ID,但它们不依赖于 CUST_ID,因为 CUST_ID 与 ORDER_DETAIL 或 SALE_DATE 之间没有联系。

为了使该表符合第二范式,你需要将列分成三个表。

首先,创建一个表来存储客户详细信息,如下面的代码块所示:

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

下一步是创建一个表来存储每个订单的详细信息:

CREATE TABLE ORDERS(
   ORDER_ID   INT              NOT NULL,
   ORDER_DETAIL VARCHAR (20)  NOT NULL,
   PRIMARY KEY (ORDER_ID)
);

最后,创建一个第三个表,只存储 CUST_ID 和 ORDER_ID,以跟踪客户的所有订单:

CREATE TABLE CUSTMERORDERS(
   CUST_ID    INT              NOT NULL,
   ORDER_ID   INT              NOT NULL,
   SALE_DATE  DATETIME,
   PRIMARY KEY (CUST_ID, ORDER_ID)
);
sql-rdbms-concepts.htm
广告