關係型資料庫設計三大正規化
作者:鄭龍飛
正規化定義
百度百科:設計關聯式資料庫時,遵從不同的規範要求,設計出合理的關係型資料庫,這些不同的規範要求被稱為不同的正規化,各種正規化呈遞次規範,越高的正規化資料庫冗餘越小。
人類語言: 正規化可以理解為設計一張資料表的表結構,符合的標準級別、規範和要求。
而通常我們用的最多的就是第一正規化(1NF)、第二正規化(2NF)、第三正規化(3NF),也就是本文要講的 “三大正規化”。
正規化的優點
採用正規化可以降低資料的冗餘性。
為什麼要降低資料的冗餘性?
- 十幾年前,磁碟很貴,為了減少磁碟儲存。
- 以前沒有分散式系統,都是單機,只能增加磁碟,磁碟個數也是有限的。
- 一次修改,需要修改多個表,很難保證資料一致性。
正規化的缺點
正規化的缺點是獲取資料時,需要透過 Join 拼接出最後的資料。
目前正規化的分類
目前業界正規化有:第一正規化 (1NF)、第二正規化 (2NF)、第三正規化 (3NF)、巴斯 - 科德正規化 (BCNF)、第四正規化 (4NF)、第五正規化 (5NF)。
什麼是函式依賴?
百度百科:函式依賴簡單點說就是:某個屬性集決定另一個屬性集時,稱另一屬性集依賴於該屬性集。
人類語言:以下面表格為例,通俗易懂的解釋,什麼是函式依賴。
學號 | 姓名 | 系名 | 系主任 | 科名 | 分數 |
---|---|---|---|---|---|
001 | 張三 | 計算機系 | 李雷 | 高等數學 | 87 |
001 | 張三 | 計算機系 | 李雷 | 大學英語 | 88 |
001 | 張三 | 計算機系 | 李雷 | 資料庫設計 | 89 |
002 | 李四 | 計算機系 | 李雷 | 高等數學 | 86 |
002 | 李四 | 計算機系 | 李雷 | java 程式設計 | 90 |
002 | 李四 | 計算機系 | 李雷 | 大學英語 | 98 |
003 | 王五 | 財務系 | 韓梅梅 | 高等數學 | 96 |
003 | 王五 | 財務系 | 韓梅梅 | 財務基礎 | 95 |
完全函式依賴
官方定義:設 X,Y 是關係 R 的兩個屬性集合,X’ 是 X 的真子集,存在 X→Y,但對每一個 X’ 都有 X’!→Y,則稱 Y 完全函式依賴於 X。
人類語言:比如透過,(學號,課程) 推出分數 ,但是單獨用學號推斷不出來分數,那麼就可以說:分數 完全依賴於 (學號,課程) 。
總結:即:透過 A B 能得出 C,但 是 A B 單獨得不出 C,那麼說 C 完全依賴於 AB。
部分函式依賴
官方定義:假如 Y 函式依賴於 X,但同時 Y 並不完全函式依賴於 X,那麼我們就稱 Y 部分函式依賴於 X。
人類語言:比如透過,(學 號,課程) 推出姓名,因為其實直接可以透過,學號推出姓名,所以:姓名 部分依賴於 (學號,課程)。
總結:透過 AB 能得出 C,透過 A 也能得出 C,或者透過 B 也能得出 C,那麼說 C 部分依賴於 AB。
傳遞函式依賴
官方定義:傳遞函式依賴:設 X,Y,Z 是關係 R 中互不相同的屬性集合,存在 X→Y(Y !→X),Y→Z,則稱 Z 傳遞函式依賴於 X。
人類語言:比如:學號 推出 系名 , 系名 推出 系主任, 但是,系主任推不出學號,系主任主要依賴於系名。這種情況可以說:系主任 傳遞依賴於 學號 。
總結:即:通 過 A 得 到 B,通 過 B 得 到 C,但 是 C 得不到 A,那 麼說 C 傳遞依賴於 A。
三正規化的區別
第一正規化
第一正規化 1NF 核心原則:屬性不可切割。
舉例說明:
學號 | 姓名 | 系名 | 系主任 | 科名 | 分數 | 學籍資訊 |
---|---|---|---|---|---|---|
001 | 張三 | 計算機系 | 李雷 | 高等數學 | 87 | 本科,大二 |
002 | 李四 | 計算機系 | 李雷 | 大學英語 | 88 | 研究生,研三 |
很明顯上面表格設計是不符合第一正規化的,學籍資訊列中的資料不是原子資料項,是可以進行分割的,因此對錶格進行修改,讓表格符合第一正規化的要求,修改結果如下圖所示:
學號 | 姓名 | 系名 | 系主任 | 科名 | 分數 | 學歷 | 所在年級 |
---|---|---|---|---|---|---|---|
001 | 張三 | 計算機系 | 李雷 | 高等數學 | 87 | 本科 | 大二 |
002 | 李四 | 計算機系 | 李雷 | 大學英語 | 88 | 研究生 | 研三 |
實際上 ,1NF 是所有關係型資料庫的最基本要求 ,你在關係型資料庫管理系統(RDBMS),例如 SQL Server,Oracle,MySQL 中建立資料表的時候,如果資料表的設計不符合這個最基本的要求,那麼操作一定是不能成功的。也就是說,只要在 RDBMS 中已經存在
的資料表,一定是符合 1NF 的。
第二正規化
第二正規化 2NF 核心原則:不能存在 “部分函式依賴”。
舉例說明:
學號 | 姓名 | 系名 | 系主任 | 科名 | 分數 |
---|---|---|---|---|---|
001 | 張三 | 計算機系 | 李雷 | 高等數學 | 87 |
001 | 張三 | 計算機系 | 李雷 | 大學英語 | 88 |
001 | 張三 | 計算機系 | 李雷 | 資料庫設計 | 89 |
002 | 李四 | 計算機系 | 李雷 | 高等數學 | 86 |
002 | 李四 | 計算機系 | 李雷 | java 程式設計 | 90 |
002 | 李四 | 計算機系 | 李雷 | 大學英語 | 98 |
003 | 王五 | 財務系 | 韓梅梅 | 高等數學 | 96 |
003 | 王五 | 財務系 | 韓梅梅 | 財務基礎 | 95 |
以上表格明視訊記憶體在,部分依賴。比 如,這張表的主鍵是 (學號,課名),分數確實完全依賴於 (學號,課名),但是姓名並不完全依賴於 (學號,課名),讓表格符合第二正規化的要求,修改結果如下圖所示:
學號 | 科名 | 分數 |
---|---|---|
001 | 高等數學 | 87 |
001 | 大學英語 | 88 |
001 | 資料庫設計 | 89 |
002 | 高等數學 | 86 |
002 | java 程式設計 | 90 |
002 | 大學英語 | 98 |
003 | 高等數學 | 96 |
003 | 財務基礎 | 95 |
學號 | 姓名 | 系名 | 系主任 |
---|---|---|---|
001 | 張三 | 計算機系 | 李雷 |
002 | 李四 | 計算機系 | 李雷 |
003 | 王五 | 財務系 | 韓梅梅 |
以上符合第二正規化,去掉部分函式依賴依賴。
第三正規化
第三正規化 3NF 核心原則:不能存在傳遞函式依賴。
舉例說明:
學號 | 姓名 | 系名 | 系主任 |
---|---|---|---|
001 | 張三 | 計算機系 | 李雷 |
002 | 李四 | 計算機系 | 李雷 |
003 | 王五 | 財務系 | 韓梅梅 |
在上面這張表中,存 在傳遞函式依賴:學號->系 名->系主任,但是系主任推不出學號。
上面表需要再次拆解:
學號 | 姓名 | 系名 |
---|---|---|
001 | 張三 | 計算機系 |
002 | 李四 | 計算機系 |
003 | 王五 | 財務系 |
系名 | 系主任 |
---|---|
計算機系 | 李雷 |
計算機系 | 李雷 |
財務系 | 韓梅梅 |
反三正規化
沒有冗餘的資料庫未必是最好的資料庫,有時為了提高執行效率,就必須降低正規化標準,適當保留冗餘資料。具體做法是: 在概念資料模型設計時遵守第三正規化,降低正規化標準的工作放到物理資料模型設計時考慮。降低正規化就是增加欄位,減少了查詢時的關聯,提高查詢效率,因為在資料庫的操作中查詢的比例要遠遠大於 DML 的比例。但是反正規化化一定要適度,並且在原本已滿足三正規化的基礎上再做調整的。
總結
引用知乎大佬對正規化的理解:
資料庫設計應該也是分為三個境界的:
第一個境界,剛入門資料庫設計,正規化的重要性還未深刻理解。這時候出現的反正規化設計,一般會出問題。
第二個境界,隨著遇到問題解決問題,漸漸瞭解到正規化的真正好處,從而能快速設計出低冗餘、高效率的資料庫。
第三個境界,再經過 N 年的鍛鍊,是一定會發覺正規化的侷限性的。此時再去打破正規化,設計更合理的反正規化部分。
相關文章
- 資料庫設計三正規化資料庫
- 【資料庫】關係模式的正規化的簡明判斷資料庫模式
- 資料庫表設計三正規化資料庫
- 關係型資料庫與非關係型資料庫介紹!資料庫
- 關係型資料庫資料庫
- 設計資料庫關係模型資料庫模型
- 關係型資料庫和非關係型資料庫的區別資料庫
- 八、資料庫的歸約,三大正規化(規範資料庫設計)資料庫
- 關係型資料庫概要資料庫
- 關係型資料庫原理資料庫
- 正規化(Normal Form)是資料庫設計中的概念。新的正規化(paradigm)ORM資料庫
- 非關係型資料庫(NOSQL)和關係型資料庫(SQL)區別詳解資料庫SQL
- 資料庫設計之三正規化的的理解資料庫
- 關係型資料庫之SQL資料庫SQL
- 關係型資料庫之索引資料庫索引
- redis—非關係型資料庫Redis資料庫
- javaWeb-day03-約束、資料庫設計、正規化、資料庫備份JavaWeb資料庫
- 資料庫入門之3張表對比關係型與非關係型資料庫資料庫
- 資料庫設計三大正規化應用例項剖析資料庫
- 資料庫建表設計六正規化介紹枘雍資料庫
- mysqlclient操作MySQL關係型資料庫MySqlclient資料庫
- SQLALchemy操作MySQL關係型資料庫MySql資料庫
- FastAPI(44)- 操作關係型資料庫ASTAPI資料庫
- Node MySQL打造關係型資料庫MySql資料庫
- 啥是資料庫正規化資料庫
- 資料庫三正規化資料庫
- 資料庫 三大正規化資料庫
- 資料庫三大正規化資料庫
- SQL與NoSQL(關係型與非關係型)資料庫的區別SQL資料庫
- MySQL系列資料庫設計三正規化教程示例隍啃MySql資料庫
- 資料庫——關係型資料庫MySQL--簡單使用資料庫MySql
- 聊聊非關係型資料庫MongoDB索引資料庫MongoDB索引
- nodejs之MongoDB 非關係型資料庫NodeJSMongoDB資料庫
- 反DDD模式之關係型資料庫模式資料庫
- 平時常見關係型資料庫資料庫
- 資料庫正規化與例項資料庫
- 資料庫——三正規化理解資料庫
- 資料庫三大正規化 Mysql資料庫MySql