1NF
就是最基本的關係數據庫
你現在能用數據庫系統做出來的數據庫最低都是1NF
注意,1NF範式沒有主鍵(碼)
1NF是滿足 無重複列,每列都不可分隔
無重複列就是說,不能有兩個一樣的列名,就是不像這樣的:
字段1 |
字段1 |
字段2 |
字段3 |
每列不可分隔就是不象這樣的:
字段1 |
字段2 |
字段3 |
字段4 |
|
字段2.1 |
字段3.1 |
|
|
字段2.2 |
|
|
就像這樣的就是1NF
字段1 |
字段2 |
字段3 |
字段4 |
例子:
學生:Student(姓名, 年齡,所在學院, 學院地點, 學院電話);
選課關係:SelectCourse(姓名, 年齡,所在學院, 學院地點, 學院電話, 課程名稱, 成績)。
因爲沒有主鍵,每門課程都要列出姓名,年齡等這些數據,這就是數據冗餘,更新或刪除操作都可能會出現異常,因爲你要更新或刪除一個學生,就需要對選課關係進行相關操作。
2NF
簡單的說 2NF就是在1NF上加上主鍵
下面這個就是2NF
簡單的說,就是每個字段都可以由主鍵來確定。
字段1(PK) |
字段2 |
字段3 |
字段4 |
例子:
學生:Student(學號(PK), 姓名, 年齡,所在學院, 學院地點, 學院電話);
課程:Course(課程名稱(PK), 學分);
選課關係:SelectCourse(學號(PK), 課程名稱, 成績)。
這樣的數據庫表是符合第二範式的, 消除了數據冗餘、(大部分,不是全部,但是1NF到2NF不是爲了消除數據冗餘,簡單的說就是爲了給了個主鍵,所以消除了部分數據冗餘)更新異常、插入異常和刪除異常。
3NF
學生關係表爲Student(學號(PK), 姓名, 年齡, 所在學院, 學院地點, 學院電話)
關鍵字爲單一關鍵字"學號",因爲存在如下決定關係:(學號) → (姓名, 年齡, 所在學院, 學院地點, 學院電話)
這個數據庫是符合2NF的,但是不符合3NF,因爲存在如下決定關係:
(學號) → (所在學院) → (學院地點, 學院電話)
即存在非關鍵字段"學院地點"、"學院電話"對關鍵字段"學號"的傳遞函數依賴。
它也會存在數據冗餘、更新異常、插入異常和刪除異常的情況。
把學生關係表分爲如下兩個表:
學生:(學號(PK), 姓名, 年齡, 所在學院(FK));
學院:(學院(PK), 地點, 電話)。
這樣的數據庫表是符合第三範式的,消除了數據冗餘、更新異常、插入異常和刪除異常。簡單的說,就是把會重複的東西另外放在一張表裏。
BCNF
BCNF其實就是3NF的改進版。
假設倉庫管理關係表
StorehouseManage(倉庫ID(PK), 存儲物品ID(FK), 管理員ID(FK), 數量)
且有一個管理員只在一個倉庫工作;一個倉庫可以存儲多種物品。這個數據庫表中存在如下決定關係:
(倉庫ID, 存儲物品ID) →(管理員ID, 數量)
(管理員ID, 存儲物品ID) → (倉庫ID, 數量)
這個表中唯一一個非關鍵字(非主鍵或非主碼):“數量”。倉庫ID、存儲物品ID、管理員ID三個作爲關鍵字,決定了非關鍵字“數量”,所以滿足了3NF。但是,倉庫ID決定了管理員ID,管理員ID也決定了倉庫ID,所以存在了關鍵字決定了關鍵字,所以不符合BCNF。
將StorehouseMange關係表分解成下面:
倉庫管理:StorehouseManage(倉庫ID(FK), 管理員ID(FK));
倉庫:Storehouse(倉庫ID(PK), 存儲物品ID, 數量)。
這兩張滿足3NF並且不存在關鍵字決定關鍵字,所以滿足了BCNF。