目錄
- 數據表設計范式
- 第一范式
- 第二范式
- 第三范式
數據表設計范式
第一范式
數據表中的所有字段都是不可分割的原子值。
字段值還可以繼續拆分的,就不滿足第一范式,如下:
下面這個,更加貼合第一范式:
范式設計得越詳細,對某些實際操作可能會更好,但并非都有好處,需要對項目的實際情況進行設定。
第二范式
在滿足第一范式的前提下,其他列都必須完全依賴于主鍵列。如果出現不完全依賴,只可能發生在聯合主鍵的情況下:
我們設計一個訂單表:
-- 訂單表
CREATE TABLE myorder (product_id INT,customer_id INT,product_name VARCHAR(20),customer_name VARCHAR(20),PRIMARY KEY (product_id, customer_id)
);
實際上,在這張訂單表中,product_name
只依賴于 product_id
,customer_name
只依賴于 customer_id
。也就是說,product_name
和 customer_id
是沒有關系的,customer_name
和 product_id
也是沒有關系的。
這就不滿足第二范式。
下面將主表拆分:
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
表中的其他字段又完全依賴于主鍵。滿足了第二范式的設計。
第三范式
在滿足第二范式的前提下,除了主鍵列之外,其他列之間不能有傳遞依賴關系。
如下,我們在myorder
中添加customer_phone
CREATE TABLE myorder (order_id INT PRIMARY KEY,product_id INT,customer_id INT,customer_phone VARCHAR(15)
);
發現,表中的 customer_phone
有可能依賴于 order_id
、 customer_id
兩列,也就不滿足了第三范式的設計:其他列之間不能有傳遞依賴關系。
我們應該這樣設計:
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)
);
修改后就不存在其他列之間的傳遞依賴關系,其他列都只依賴于主鍵列,滿足了第三范式的設計!