第二范式指出,它應(yīng)滿足所有1NF的規(guī)則,必須有任意列不依賴主鍵關(guān)系:
考慮客戶訂單的關(guān)系,你想存儲客戶ID,客戶名稱,訂單ID和訂單的細(xì)節(jié),以及購買日期:
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) );
此表是第一范式,因為它遵循了第一范式的所有規(guī)則。在該表中,主鍵由CUST_ID和ORDERID組成。 它們是唯一的,假設(shè)同一客戶將很難訂購?fù)瑯拥臇|西。
然而,該表不是在第二范式,因為有主鍵和列的部分相關(guān)性。CUST_NAME依賴于CUST_ID,并有一個客戶的名字和他所購買之間沒有真正的聯(lián)系。訂單細(xì)節(jié)和購買日期也取決于ORDERID,但他們不依賴于CUST_ID,因為有一個CUST_ID和訂單的詳細(xì)信息或SALE_DATE之間沒有聯(lián)系。
為了使這個表符合第二范式,需要的列分在三個表。
首先,創(chuàng)建一個表來存儲客戶的詳細(xì)信息如下:
CREATE TABLE CUSTOMERS( CUST_ID INT NOT NULL, CUST_NAME VARCHAR (20) NOT NULL, PRIMARY KEY (CUST_ID) );
接下來,創(chuàng)建一個表來存儲每個訂單的詳細(xì)信息:
CREATE TABLE ORDERS( ORDER_ID INT NOT NULL, ORDER_DETAIL VARCHAR (20) NOT NULL, PRIMARY KEY (ORDER_ID) );
最后,創(chuàng)建第三個表存儲只是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) );