數據庫範式
範式用於規定關係數據庫表結構的一種規範,以減小數據的冗餘。
範式主要有以下幾種:
BCNF範式∈第三範式∈第二範式∈第一範式
它們之間是一個子集關係,滿足第二範式必滿足第一範式
下面就來仔細說說這些範式:
一、 第一範式
通俗的說就是數據庫中不能表中有表,某一列中不能再嵌套其他列,請看下面這個表結構
學號 |
姓名 |
院系及專業 |
|
學院 |
專業 |
院系及專業這一列裏又嵌套了兩列就不符合第一範式
改正:
學號 |
姓名 |
院系 |
專業 |
這樣學生表就符合第一範式
二、 第二範式
主鍵如果是多個列組合起來的,找不到一列完全依賴於部分主鍵
比如這樣一張表
學生 |
課程 |
老師 |
老師職稱 |
教材 |
教室 |
上課時間 |
某學生上一門課,上課的地點、老師、老師的職稱、所用教材、時間一定是確定的,那麼(學生、課程)聯合起來組成了該表的主鍵
但是(課程à教材),就找到了一列完全依賴於部分主鍵
?這樣的部分依賴會造成什麼樣的影響呢
1)數據冗餘
共有m個學生選《數據結構》這門課,那麼數據結構的教材就要出現m次
2)更新異常
①如果要修改《數據結構》這一門課的教材,那麼就得把所有選該課的記錄都要修改,太麻煩了
②如果有學生沒有選課,那麼該學生的信息無法加入
③如果有的課程沒有學生選,那麼該課程的信息無法查詢
3)刪除異常
如果某學生撤消了選課記錄,重新選擇,那麼在刪除選課記錄時將課程信息也刪除了找不到該課程所用的教材
→→→改正:
將上表分離成兩個表:
學生 |
課程 |
老師 |
老師職稱 |
教師 |
上課時間 |
課程 |
教材 |
三、第三範式-------不能有傳遞依賴
在上面
學生 |
課程 |
老師 |
老師職稱 |
教師 |
上課時間 |
?產生的影響
① 老師職稱改變,需要在表中修改很多次
② 某學生不選哪個老師的課,該老師的職稱信息無從查找
③ 某老師剛來學校報到,現無學生選他的課那麼該老師的信息無法插入到表中
→→→改正:
將表繼續拆分爲兩個表
學生 | 課程 | 老師 | 教室 | 上課時間 |
老師 |
老師職稱 |
四、BCNF範式
【該部分內容引自百度空間http://hi.baidu.com/cy005/item/feea7816f399ce3db93180a2】
鮑依斯-科得範式(BCNF):在第三範式的基礎上,數據庫表中如果不存在任何字段對任一候選關鍵字段的傳遞函數依賴則符合第三範式。
假設倉庫管理關係表爲StorehouseManage(倉庫ID, 存儲物品ID, 管理員ID, 數量),且有一個管理員只在一個倉庫工作;一個倉庫可以存儲多種物品。這個數據庫表中存在如下決定關係:
(倉庫ID, 存儲物品ID) →(管理員ID, 數量)
(管理員ID, 存儲物品ID) → (倉庫ID, 數量)
所以,(倉庫ID, 存儲物品ID)和(管理員ID, 存儲物品ID)都是StorehouseManage的候選關鍵字,表中的唯一非關鍵字段爲數量,它是符合第三範式的。但是,由於存在如下決定關係:
(倉庫ID) → (管理員ID)
(管理員ID) → (倉庫ID)
即存在關鍵字段決定關鍵字段的情況,所以其不符合BCNF範式。它會出現如下異常情況:
(1) 刪除異常:
當倉庫被清空後,所有"存儲物品ID"和"數量"信息被刪除的同時,"倉庫ID"和"管理員ID"信息也被刪除了。
(2) 插入異常:
當倉庫沒有存儲任何物品時,無法給倉庫分配管理員。
(3) 更新異常:
如果倉庫換了管理員,則表中所有行的管理員ID都要修改。
把倉庫管理關係表分解爲二個關係表:
倉庫管理:StorehouseManage(倉庫ID, 管理員ID);
倉庫:Storehouse(倉庫ID, 存儲物品ID, 數量)。
這樣的數據庫表是符合BCNF範式的,消除了刪除異常、插入異常和更新異常。