面試突擊52:什麼是三正規化?它有什麼用?

語言: CN / TW / HK

持續創作,加速成長!這是我參與「掘金日新計劃 · 6 月更文挑戰」的第4天,點選檢視活動詳情

1.第一正規化

第一正規化規定表中的每個列都應該是不可分割的最小單元。比如以下表中的 address 欄位就不是不可分割的最小單元,如下圖所示: image.png 其中 address 還可以拆分為國家和城市,如下圖所示: image.png 這樣改造之後,上面的表就滿足第一正規化了。

2.第二正規化

第二正規化是在滿足第一正規化的基礎上,規定表中的非主鍵列不存在對主鍵的部分依賴,也就是說每張表只描述一件事情,比如以下訂單表就不滿足第二正規化,它可以拆分為兩張獨立的表:訂單表和商品表。

2.1 不滿足第二正規化的訂單表

image.png

PS:上面的表可拆分為兩張獨立的表:訂單表和商品表。

2.2 滿足第二正規化的表

訂單表: image.png 商品表: image.png

3.第三正規化

第三正規化是在滿足第一正規化和第二正規化的基礎上,規定表中的列不存在對非主鍵列的傳遞依賴。比如以下的訂單表中的顧客名稱就不符合第三正規化,因為它存在了對非主鍵顧客編號的依賴,如下圖所示: image.png 修改之後(符合第三正規化)的表結構如下: image.png

總結

第一正規化規定表中的每個列都應該是不可分割的最小單元。第二正規化是在滿足第一正規化的基礎上,規定表中的非主鍵列不存在對主鍵的部分依賴。第三正規化是在滿足第一正規化和第二正規化的基礎上,規定表中的列不存在對非主鍵列的傳遞依賴。使用資料庫三正規化的優勢是:表的結構更簡單、優雅,表的邏輯和條理性更強,並且使用三正規化可以很大程度的減少表中的冗餘資料,很好的節省了資料庫的儲存資源。

參考 & 鳴謝

《Offer 來了》

是非審之於己,譭譽聽之於人,得失安之於數。

公眾號:Java面試真題解析

面試合集:http://gitee.com/mydb/interview