數據庫 - 第二範式(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) );