資料庫 - 第二正規化 (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
廣告