1.1NF
只要字段值還可以繼續(xù)拆分,就不滿足第一范式。
范式設(shè)計(jì)得越詳細(xì),對(duì)某些實(shí)際操作可能會(huì)更好,但并非都有好處,需要對(duì)項(xiàng)目的實(shí)際情況進(jìn)行設(shè)定。
2.2NF(在滿足第一范式的前提下,其他列都必須完全依賴于主鍵列。如果出現(xiàn)不完全依賴,只可能發(fā)生在聯(lián)合主鍵的情況下)
-- 訂單表
CREATE TABLE myorder (
? ? product_id INT,
? ? customer_id INT,
? ? product_name VARCHAR(20),
? ? customer_name VARCHAR(20),
? ? PRIMARY KEY (product_id, customer_id)
);
實(shí)際上,在這張訂單表中,product_name?只依賴于?product_id?,customer_name?只依賴于?customer_id?。也就是說(shuō),product_name?和?customer_id?是沒(méi)關(guān)系的customer_name?和?product_id?也是沒(méi)有關(guān)系的。
這就不滿足第二范式:其他列都必須完全依賴于主鍵列!
CREATE TABLE myorder (
? ? order_id INT PRIMARY KEY,
? ? product_id INT,
? ? customer_id INT
);
CREATE TABLE product (
? ? id INT PRIMARY KEY,
? ? name VARCHAR(20)
);
CREATE TABLE customer (
? ? id INT PRIMARY KEY,
? ? name VARCHAR(20)
);
拆分之后,myorder?表中的?product_id?和?customer_id?完全依賴于?order_id?主鍵,而?product?和?customer?表中的其他字段又完全依賴于主鍵。滿足了第二范式的設(shè)計(jì)
3.3NF
在滿足第二范式的前提下,除了主鍵列之外,其他列之間不能有傳遞依賴關(guān)系。
CREATE TABLE myorder (
? ? order_id INT PRIMARY KEY,
? ? product_id INT,
? ? customer_id INT,
? ? customer_phone VARCHAR(15)
);
表中的?customer_phone?有可能依賴于?order_id?、?customer_id?兩列,也就不滿足了第三范式的設(shè)計(jì):其他列之間不能有傳遞依賴關(guān)系。
CREATE TABLE myorder (
? ? order_id INT PRIMARY KEY,
? ? product_id INT,
? ? customer_id INT
);
CREATE TABLE customer (
? ? id INT PRIMARY KEY,
? ? name VARCHAR(20),
? ? phone VARCHAR(15)
);
修改后就不存在其他列之間的傳遞依賴關(guān)系,其他列都只依賴于主鍵列,滿足了第三范式的設(shè)計(jì)!