1. 程式人生 > >數據庫的三大範式

數據庫的三大範式

數據表 一致性 更新 問題: nbsp 刪除 數據冗余 com 需要

第一範式(1NF):符合1NF的關系中的每個屬性都不可再分,1NF是所有關系型數據庫的最基本要求。

技術分享圖片

                           不符合1NF的表結構

 技術分享圖片

                           符合1NF的表結構

  僅僅只滿足第一範式存在的問題:冗余數據過大、插入異常、刪除異常、更新異常。

技術分享圖片

                        僅僅符合第一範式的表結構

  數據冗余過大:每一名學生的學號、姓名、系名、系主任這些數據重復多次。每個系與對應的系主任的數據也重復多次。

  插入異常:假如學校新建了一個系,但是暫時還沒有招收任何學生(比如3月份就新建了,但要等到8月份才招生),那麽是無法將系名與系主任的數據單獨地添加到數據表中去的 。

       表中的所有屬性不能為空。

  刪除異常:假如將某個系中所有學生相關的記錄都刪除,那麽所有系與系主任的數據也就隨之消失了(一個系所有學生都沒有了,並不表示這個系就沒有了)。

  更新異常:假如李小明轉系到法律系,那麽為了保證數據庫中數據的一致性,需要修改三條記錄中系與系主任的數據。

  第二範式(2NF): 2NF在1NF的基礎之上,消除了非主屬性對於碼的部分函數依賴。

技術分享圖片技術分享圖片

                    符合第二範式的表結構

  第二範式對第一範式的改進:

  數據冗余過大:學生的姓名、系名與系主任,不再像之前一樣重復那麽多次了。

  更新異常:李小明轉系到法律系只需要修改一次李小明對應的系的值即可。

  第二範式存在的問題:

  刪除異常:刪除某個系中所有的學生記錄該系的信息仍然全部丟失。

  插入異常:插入一個尚無學生的新系的信息。因為學生表的碼是學號,不能為空,所以此操作不被允許。

  第三範式:3NF在2NF的基礎之上,消除了非主屬性對於碼的傳遞函數依賴。

技術分享圖片

技術分享圖片

技術分享圖片

  第三範式對第二範式的改進:

  數據冗余過大:數據冗余更加少了  

  插入異常:插入一個尚無學生的新系的信息。因為系表與學生表目前是獨立的兩張表,所以不影響

  刪除異常:刪除某個系中所有的學生記錄該系的信息不會丟失。

  總結:符合3NF要求的數據庫設計,基本上解決了數據冗余過大,插入異常,修改異常,刪除異常的問題。當然,在實際中,往往為了性能上或者應對擴展的需要,經常 做到2NF或者1NF。

  參考資料:https://zhuanlan.zhihu.com/p/20028672

  

數據庫的三大範式