數據庫三范式


什么是三范式

設計關系型數據庫時,遵從不同的規范要求,設計出合理的關系型數據庫,這些不同的規范要求被稱為不同的范式,各種范式呈遞次規范,越高的范式數據庫冗余越小。

目前關系型數據庫有六種范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又稱完美范式)。一般來說,數據庫只需要滿足第三范式就行了。

 

第一范式:保證每列的原子性

第一范式是最基本的范式。如果數據庫表中的所有字段值都是不可分解的原子值,就說明該數據庫滿足了第一范式。

第一范式需要根據系統的實際需求來定,比如有一張用戶信息表:

一般來說"住址"設計成一個字段就行,但是如果經常訪問"住址"中城市的部分,那么就非要將"住址"這個屬性重新拆分為"省份"、"城市"、"地址"等多個部分進行存儲,這樣在對"住址"中某一部分進行操作的時候將非常方便。這么設計才算滿足了數據庫的第一范式,修改之后的表結構如圖:

 

第二范式:保證一張表只描述一件事情

這是通俗的說法,用第二范式的定義描述第二范式,說的是在滿足第一范式的基礎上,數據庫表中不存在非關鍵字段對任一候選關鍵字段的部分函數依賴,也即所有非關鍵字段都完全依賴於任一組候選關鍵字。

看不懂是嗎,沒關系,我也看不懂,下面舉一個例子,有一張表如下圖:

上表滿足第一范式,即每個字段不可再分,但是這張表設計得並不好,或者說,這張表的設計並不滿足第二范式。因為這張表里面描述了兩件事情:學生信息、課程信息,"學分"完全依賴於"課程名稱"、"姓名"與"年齡"完全依賴於"學號"。這么做的后果是:

1、數據冗余:同一門課程由n個學生選修,"學分"重復n-1次;同一個學生選修了m門課程,姓名和年齡重復m-1次

2、更新異常:若調整了某門課程的學分,數據表中所有行的"學分"值都需要更新,否則會出現同一門課程學分不同的情況

3、插入異常:假設要開一門新課程,暫時沒有人選修,那么由於沒有"學號"關鍵字,"課程"與"學分"也無法記錄入數據庫

4、刪除異常:假設一批學生已經完成課程的選修,這些選修記錄就應該從數據庫表中刪除。但是,與此同時,"課程"和"學分"也被刪除了,顯然,這最終可能會導致插入異常

所以,此表的結構必須修改,修改后如下:

增加了表,將學生信息與課程信息通過一張中間表關聯,很好地解決了上面的幾個問題,這就是第二范式的中心----保證一張表只講一件事情。

 

第三范式----保證每列都和主鍵直接相關

第三范式又和第二范式相關,用第三范式的定義描述第三范式就是,數據庫表中如果不存在非關鍵字段任一候選關鍵字段的傳遞函數依賴則符合第三范式,所謂傳遞函數依賴指的是如果存在"A-->B-->C"的決定關系,則C傳遞函數依賴於A。也就是說表中的字段和主鍵直接對應不依靠其他中間字段,說白了就是,決定某字段值的必須是主鍵

舉個例子,看一下如下的表結構:

第三范式和第二范式有點像,從這張數據庫表結構中可以看出,"姓名"、"年齡"、"學院"和主鍵"學號"直接關聯,但是"學院地點"、"學院電話"卻不直接和主鍵"學號"相關聯,和"學院電話"直接相關聯的是"學院",如果表結構這么設計,同樣會造成和第二范式一樣的數據冗余、更新異常、插入異常、刪除異常的問題。

修改之后的表結構如下圖:

同樣,這么設計表結構將合理地多,也解決了前面的四個問題。

 

后記

定理是死的,人是活的,在前人給我們總結出這些范式的前提下,使用這些范式靈活地應用到實際需求中,才是最重要的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM