后端MySQL數(shù)據(jù)庫四大范式詳細(xì)解析
梳理一下 MySQL(或關(guān)系型數(shù)據(jù)庫)中的第一、二、三、四范式,這是數(shù)據(jù)庫設(shè)計(jì)中非常重要的規(guī)范化理論。
第一范式 (1NF:First Normal Form)
定義:字段具有原子性,不可再分。
數(shù)據(jù)表中每一列都必須是不可分割的最小數(shù)據(jù)單元。
每一行都應(yīng)該是唯一的(通常通過主鍵來保證)。
? 舉例:
不符合 1NF:
學(xué)生表 學(xué)號(hào) 姓名 聯(lián)系方式 1 張三 1380000, 1391111
問題:聯(lián)系方式有多個(gè)值,違反原子性。
符合 1NF:
學(xué)生表 學(xué)號(hào) 姓名 聯(lián)系方式 1 張三 1380000 1 張三 1391111
第二范式 (2NF:Second Normal Form)
定義:在 1NF 的基礎(chǔ)上,要求每個(gè)非主屬性完全依賴于主鍵,不能只依賴主鍵的一部分。
適用于 聯(lián)合主鍵 的情況。
消除部分依賴。
? 舉例:
不符合 2NF:
選課表 學(xué)號(hào)+課程號(hào) (聯(lián)合主鍵) 姓名 成績 1+001 張三 95
問題:姓名只依賴學(xué)號(hào),而不是依賴于 (學(xué)號(hào)+課程號(hào)) 這個(gè)整體主鍵。
符合 2NF(拆表):
學(xué)生表 學(xué)號(hào) 姓名 選課表 學(xué)號(hào) 課程號(hào) 成績
第三范式 (3NF:Third Normal Form)
定義:在 2NF 基礎(chǔ)上,非主屬性不依賴于其他非主屬性(消除傳遞依賴)。
屬性不能依賴于主鍵之外的屬性。
? 舉例:
不符合 3NF:
學(xué)生表 學(xué)號(hào) 姓名 系編號(hào) 系名稱
問題:系名稱依賴于系編號(hào),而系編號(hào)又依賴學(xué)號(hào)(學(xué)號(hào) → 系編號(hào) → 系名稱,產(chǎn)生傳遞依賴)。
符合 3NF(拆表):
學(xué)生表 學(xué)號(hào) 姓名 系編號(hào) 系別表 系編號(hào) 系名稱
第四范式 (4NF:Fourth Normal Form)
定義:在 3NF 基礎(chǔ)上,要求多值依賴消除。
一張表中不應(yīng)包含兩個(gè)或多個(gè)相互獨(dú)立的多對(duì)多關(guān)系。
? 舉例:
不符合 4NF:
學(xué)生表 學(xué)號(hào) 愛好 擅長課程 1 足球 數(shù)學(xué) 1 足球 英語 1 籃球 數(shù)學(xué) 1 籃球 英語
問題:愛好與擅長課程之間是獨(dú)立的多值依賴,導(dǎo)致大量冗余。
符合 4NF(拆表):
學(xué)生_愛好表 學(xué)號(hào) 愛好 學(xué)生_課程表 學(xué)號(hào) 擅長課程
總結(jié)
1NF:字段不可再分(原子性)
2NF:非主屬性完全依賴主鍵(消除部分依賴)
3NF:非主屬性不依賴于其他非主屬性(消除傳遞依賴)
4NF:不允許一個(gè)表里有多個(gè)獨(dú)立的多值依賴
?? 實(shí)際開發(fā)中:
3NF 已經(jīng)能滿足大部分場景;
4NF 更偏學(xué)術(shù),業(yè)務(wù)里一般用到 3NF + 適當(dāng)?shù)姆匆?guī)范化(為了性能)。
?? 那我?guī)湍阏硪粋€(gè) 1NF ~ 4NF 對(duì)比表,方便快速理解和記憶:
數(shù)據(jù)庫范式對(duì)比表
| 范式 | 要求 | 典型問題 | 示例(不符合) | 示例(符合) |
|---|---|---|---|---|
| 第一范式 (1NF) | 字段必須原子化,不可再分 | 字段中有多個(gè)值,違反原子性 | 聯(lián)系方式: 1380000, 1391111 | 每條記錄一條聯(lián)系方式 |
| 第二范式 (2NF) | 在 1NF 基礎(chǔ)上,非主屬性必須完全依賴主鍵,不能部分依賴 | 聯(lián)合主鍵時(shí),非主屬性只依賴其中一部分 | (學(xué)號(hào)+課程號(hào)) → 姓名 | 將姓名拆到“學(xué)生表” |
| 第三范式 (3NF) | 在 2NF 基礎(chǔ)上,非主屬性不能依賴其他非主屬性(消除傳遞依賴) | 非主屬性依賴另一個(gè)非主屬性 | 學(xué)號(hào) → 系編號(hào) → 系名稱 | 把“系編號(hào)-系名稱”拆到“系別表” |
| 第四范式 (4NF) | 在 3NF 基礎(chǔ)上,消除多值依賴(不能同時(shí)描述多個(gè)獨(dú)立的多對(duì)多關(guān)系) | 一張表里既存儲(chǔ)“愛好”,又存儲(chǔ)“擅長課程” | 學(xué)號(hào) → 愛好 和 學(xué)號(hào) → 擅長課程 | 分成“學(xué)生_愛好表”和“學(xué)生_課程表” |
?? 記憶口訣:
1NF:字段原子化
2NF:消除部分依賴
3NF:消除傳遞依賴
4NF:消除多值依賴
畫一個(gè) 范式演進(jìn)示意圖(從 1NF → 4NF,逐步拆表的過程)這樣更直觀。
畫一個(gè) 1NF → 4NF 的演進(jìn)示意圖,用一個(gè)「學(xué)生」場景,逐步展示規(guī)范化的過程:
范式演進(jìn)示意圖
未規(guī)范化
學(xué)生表 學(xué)號(hào) | 姓名 | 聯(lián)系方式 | 系名稱 | 愛好 | 擅長課程 1 | 張三 | 1380000,1391111 | 計(jì)算機(jī)系 | 足球 | 數(shù)學(xué)
問題:
聯(lián)系方式不原子化(違反 1NF)
姓名只依賴學(xué)號(hào),不依賴課程號(hào)(違反 2NF)
系名稱依賴于系編號(hào),而不是直接依賴學(xué)號(hào)(違反 3NF)
愛好和課程是獨(dú)立的多值依賴(違反 4NF)
第一范式 (1NF)
解決字段不可再分 → 拆分聯(lián)系方式
學(xué)生表 學(xué)號(hào) | 姓名 | 聯(lián)系方式 | 系編號(hào) | 系名稱 | 愛好 | 擅長課程 1 | 張三 | 1380000 | 01 | 計(jì)算機(jī) | 足球 | 數(shù)學(xué) 1 | 張三 | 1391111 | 01 | 計(jì)算機(jī) | 足球 | 數(shù)學(xué)
第二范式 (2NF)
解決部分依賴 → 拆分“學(xué)生”和“選課”
學(xué)生表 學(xué)號(hào) | 姓名 | 系編號(hào) 選課表 學(xué)號(hào) | 課程號(hào) | 成績
第三范式 (3NF)
解決傳遞依賴 → 把系名稱單獨(dú)拆表
學(xué)生表 學(xué)號(hào) | 姓名 | 系編號(hào) 系別表 系編號(hào) | 系名稱 選課表 學(xué)號(hào) | 課程號(hào) | 成績
第四范式 (4NF)
解決多值依賴 → 愛好、擅長課程單獨(dú)拆表
學(xué)生表 學(xué)號(hào) | 姓名 | 系編號(hào) 系別表 系編號(hào) | 系名稱 選課表 學(xué)號(hào) | 課程號(hào) | 成績 學(xué)生_愛好表 學(xué)號(hào) | 愛好 學(xué)生_課程表 學(xué)號(hào) | 擅長課程
?? 最終結(jié)果:
每張表結(jié)構(gòu)更清晰,避免冗余和異常(插入、更新、刪除異常)。
實(shí)際項(xiàng)目中常用到 3NF,4NF 更多是學(xué)術(shù)或復(fù)雜業(yè)務(wù)場景。
總結(jié)
到此這篇關(guān)于后端MySQL數(shù)據(jù)庫四大范式的文章就介紹到這了,更多相關(guān)后端數(shù)據(jù)庫四大范式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用存儲(chǔ)過程實(shí)現(xiàn)循環(huán)插入100條記錄
本節(jié)主要介紹了使用存儲(chǔ)過程實(shí)現(xiàn)循環(huán)插入100條記錄的具體實(shí)現(xiàn),需要的朋友可以參考下2014-07-07
MySQL判別InnoDB表是獨(dú)立表空間還是共享表空間的方法詳解
這篇文章主要給大家介紹了關(guān)于MySQL判別InnoDB表是獨(dú)立表空間還是共享表空間的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09
MySQL一次性創(chuàng)建表格存儲(chǔ)過程實(shí)戰(zhàn)
這篇文章主要介紹了MySQL一次性創(chuàng)建表格存儲(chǔ)過程實(shí)戰(zhàn),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-07-07
MySQL不適合創(chuàng)建索引的11種情況示例分析
這篇文章介紹了在MySQL中不適合創(chuàng)建索引的11種情況,本文通過示例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2025-02-02

