位置:首頁 > 數據庫 > SQL教學 > 數據庫 - 第二範式(2NF)

數據庫 - 第二範式(2NF)

第二範式指出,它應滿足所有1NF的規則,必須有任意列不依賴主鍵關係:

考慮客戶訂單的關係,你想存儲客戶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和ORDERID組成。 它們是唯一的,假設同一客戶將很難訂購同樣的東西。

然而,該表不是在第二範式,因為有主鍵和列的部分相關性。CUST_NAME依賴於CUST_ID,並有一個客戶的名字和他所購買之間冇有真正的聯係。訂單細節和購買日期也取決於ORDERID,但他們不依賴於CUST_ID,因為有一個CUST_ID和訂單的詳細信息或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)
);