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