面試突擊:什么是三范式?它有什么用?
作者 | 磊哥
來源 | Java面試真題解析(ID:aimianshi666)
轉載請聯系授權(微信ID:GG_Stone)
一、第一范式
第一范式規定表中的每個列都應該是不可分割的最小單元。比如以下表中的 address 字段就不是不可分割的最小單元,如下圖所示:
其中 address 還可以拆分為國家和城市,如下圖所示:
這樣改造之后,上面的表就滿足第一范式了。
二、第二范式
第二范式是在滿足第一范式的基礎上,規定表中的非主鍵列不存在對主鍵的部分依賴,也就是說每張表只描述一件事情,比如以下訂單表就不滿足第二范式,它可以拆分為兩張獨立的表:訂單表和商品表。
1、不滿足第二范式的訂單表
PS:上面的表可拆分為兩張獨立的表:訂單表和商品表。
2、 滿足第二范式的表
訂單表:
商品表:
三、第三范式
第三范式是在滿足第一范式和第二范式的基礎上,規定表中的列不存在對非主鍵列的傳遞依賴。比如以下的訂單表中的顧客名稱就不符合第三范式,因為它存在了對非主鍵顧客編號的依賴,如下圖所示:
修改之后(符合第三范式)的表結構如下:
總結
第一范式規定表中的每個列都應該是不可分割的最小單元。第二范式是在滿足第一范式的基礎上,規定表中的非主鍵列不存在對主鍵的部分依賴。第三范式是在滿足第一范式和第二范式的基礎上,規定表中的列不存在對非主鍵列的傳遞依賴。使用數據庫三范式的優勢是:表的結構更簡單、優雅,表的邏輯和條理性更強,并且使用三范式可以很大程度的減少表中的冗余數據,很好的節省了數據庫的存儲資源。