面試突擊52:什麼是三正規化?它有什麼用?
持續創作,加速成長!這是我參與「掘金日新計劃 · 6 月更文挑戰」的第4天,點選檢視活動詳情
1.第一正規化
第一正規化規定表中的每個列都應該是不可分割的最小單元。比如以下表中的 address 欄位就不是不可分割的最小單元,如下圖所示: 其中 address 還可以拆分為國家和城市,如下圖所示: 這樣改造之後,上面的表就滿足第一正規化了。
2.第二正規化
第二正規化是在滿足第一正規化的基礎上,規定表中的非主鍵列不存在對主鍵的部分依賴,也就是說每張表只描述一件事情,比如以下訂單表就不滿足第二正規化,它可以拆分為兩張獨立的表:訂單表和商品表。
2.1 不滿足第二正規化的訂單表
PS:上面的表可拆分為兩張獨立的表:訂單表和商品表。
2.2 滿足第二正規化的表
訂單表: 商品表:
3.第三正規化
第三正規化是在滿足第一正規化和第二正規化的基礎上,規定表中的列不存在對非主鍵列的傳遞依賴。比如以下的訂單表中的顧客名稱就不符合第三正規化,因為它存在了對非主鍵顧客編號的依賴,如下圖所示: 修改之後(符合第三正規化)的表結構如下:
總結
第一正規化規定表中的每個列都應該是不可分割的最小單元。第二正規化是在滿足第一正規化的基礎上,規定表中的非主鍵列不存在對主鍵的部分依賴。第三正規化是在滿足第一正規化和第二正規化的基礎上,規定表中的列不存在對非主鍵列的傳遞依賴。使用資料庫三正規化的優勢是:表的結構更簡單、優雅,表的邏輯和條理性更強,並且使用三正規化可以很大程度的減少表中的冗餘資料,很好的節省了資料庫的儲存資源。
參考 & 鳴謝
《Offer 來了》
是非審之於己,譭譽聽之於人,得失安之於數。
公眾號:Java面試真題解析
「其他文章」
- 面試官:什麼是雙親委派模型?
- 面試官:熔斷和降級有什麼區別?
- 寬表為什麼橫行?
- 有沒有完全自主的國產化資料庫技術
- 面試突擊64:瞭解 HTTP 協議嗎?
- 面試突擊80:說一下 Spring 中 Bean 的生命週期?
- 面試突擊89:事務隔離級別和傳播機制有什麼區別?
- 面試突擊82:SpringBoot 中如何操作事務?
- 面試突擊87:說一下 Spring 事務傳播機制?
- 面試突擊81:什麼是跨域問題?如何解決?
- 面試突擊71:GET 和 POST 有什麼區別?
- 面試突擊70:什麼是粘包和半包?怎麼解決?
- 面試突擊68:為什麼 TCP 需要 3 次握手?
- 面試突擊66:請求轉發和請求重定向有什麼區別?
- 面試突擊63:MySQL 中如何去重?
- 面試突擊65:為什麼要用HTTPS?它有什麼優點?
- 面試突擊62:group by 有哪些注意事項?
- 面試突擊53:常見的 HTTP 狀態碼有哪些?
- 面試突擊61:說一下MySQL事務隔離級別?
- 面試突擊52:什麼是三正規化?它有什麼用?