數據庫的三大範式
第一範式(1NF):符合1NF的關系中的每個屬性都不可再分,1NF是所有關系型數據庫的最基本要求。
不符合1NF的表結構
符合1NF的表結構
僅僅只滿足第一範式存在的問題:冗余數據過大、插入異常、刪除異常、更新異常。
僅僅符合第一範式的表結構
數據冗余過大:每一名學生的學號、姓名、系名、系主任這些數據重復多次。每個系與對應的系主任的數據也重復多次。
插入異常:假如學校新建了一個系,但是暫時還沒有招收任何學生(比如3月份就新建了,但要等到8月份才招生),那麽是無法將系名與系主任的數據單獨地添加到數據表中去的 。
表中的所有屬性不能為空。
刪除異常:假如將某個系中所有學生相關的記錄都刪除,那麽所有系與系主任的數據也就隨之消失了(一個系所有學生都沒有了,並不表示這個系就沒有了)。
更新異常:假如李小明轉系到法律系,那麽為了保證數據庫中數據的一致性,需要修改三條記錄中系與系主任的數據。
第二範式(2NF): 2NF在1NF的基礎之上,消除了非主屬性對於碼的部分函數依賴。
符合第二範式的表結構
第二範式對第一範式的改進:
數據冗余過大:學生的姓名、系名與系主任,不再像之前一樣重復那麽多次了。
更新異常:李小明轉系到法律系只需要修改一次李小明對應的系的值即可。
第二範式存在的問題:
刪除異常:刪除某個系中所有的學生記錄該系的信息仍然全部丟失。
插入異常:插入一個尚無學生的新系的信息。因為學生表的碼是學號,不能為空,所以此操作不被允許。
第三範式:3NF在2NF的基礎之上,消除了非主屬性對於碼的傳遞函數依賴。
第三範式對第二範式的改進:
數據冗余過大:數據冗余更加少了
插入異常:插入一個尚無學生的新系的信息。因為系表與學生表目前是獨立的兩張表,所以不影響
刪除異常:刪除某個系中所有的學生記錄該系的信息不會丟失。
總結:符合3NF要求的數據庫設計,基本上解決了數據冗余過大,插入異常,修改異常,刪除異常的問題。當然,在實際中,往往為了性能上或者應對擴展的需要,經常 做到2NF或者1NF。
參考資料:https://zhuanlan.zhihu.com/p/20028672
數據庫的三大範式