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