資料庫系列 - 3: 資料庫正規化

更新於 2024/10/06閱讀時間約 2 分鐘

接下來我們來講解一下資料庫的正規化吧!

介紹與定義

過去的資料庫主要是儲存資料的容器,只要有資料,就會不斷地被寫入其中。儘管資料庫設置了欄位和鍵值,隨著時間的推移,重複的資料仍然會不斷累積,導致在進行 CRUD 操作時變得不再方便。為了解決這個問題,我們需要對資料庫進行正規化處理。簡單來說,資料庫的正規化是通過消除重複資料來提高資料庫效能和管理便捷性的一種方法。

正規化有好幾階段,以下就來一一介紹。

第一正規化(1NF)

第一正規化的目標是去除重複資料。此階段有三件要做的事情,分別為一個欄位儲存一項資料刪除重複意義的欄位以及設定主鍵

後面兩項應該很容易理解因此不贅述,而第一項的「一個欄位儲存一項資料」則是許多人時常忽略的點。舉例來說,如果是紀錄每個人購買品項的資料表,在品項那邊不應該再出現「牛奶、泡芙」這種內容,而是應該只寫一個品項、總共寫入兩筆資料才對。

(調整前)

raw-image

(調整後)

raw-image


第二正規化(2NF)

第二正規化的目標是去除部分功能相依

在完成第一正規化後,我們的資料表應該都有主鍵了,因此這個階段就是要確保每個欄位都要跟主鍵有直接關聯,將那些無關聯的欄位資料額外拉出去做新的表。

舉例來說,系上40位同學總共有5堂課可以搶(平均8人一堂課),我們可以將課堂本身的資料做成另外一張表。從另一個角度來說,如果其中一堂課的課程名稱有調整,那麼調整前的資料表就需要改8筆資料;相比之下,調整後的資料表僅需調整課程表上的名稱即可。

(調整前)

raw-image

(調整後)

raw-image


第三正規化(3NF)

第三正規化的目標是去除遞移相依

在確保每個欄位與主鍵的直接關聯性後,接下來我們需要確認除主鍵外的每個欄位之間是否有其他的關聯性。針對這些有關聯性欄位,可以考慮再拉出去做成新的表。

舉例來說,購買清單表中的數量與總金額有線性關係、課程資料表中老師姓名與老師辦公室之間也有直接關係等。

其他正規化與經驗談

其實往後還有拓展到 6NF 以及其他的正規化種類,例如 BCNF、DK正規化等,不過實務上普遍僅會做到第三正規化就足夠使用了。正如一開始的介紹中提到的,正規化的目的是讓資料更易於管理與操作,因此只有當資料基數夠大時才需要去考慮正規化的深度;反之,如果資料本身不夠多,做太多正規化處理只會徒增資料庫的負擔(因為你可能更新一筆資料時要處理好幾張資料表)。

話說回來,我也曾經遇過資料基數不小(幾十萬筆)但是卻沒有做任何資料庫正規化的公司呢 XD

參考資料

  1. https://zh.wikipedia.org/zh-tw/数据库规范化
  2. https://learn.microsoft.com/zh-tw/office/troubleshoot/access/database-normalization-description
avatar-img
2會員
23內容數
test
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
林柏宇的沙龍 的其他內容
本文探討資料庫中的索引及其關鍵概念,涵蓋何謂索引、其類型與設立原因、索引失效情況及 B-tree 與 B+ tree 的差異,並簡要區分主鍵與外鍵的功能。瞭解索引的運作有助於提升資料查詢效率,並正確選擇適當的索引策略,以確保資料庫的高效運行。
本文介紹關聯式資料庫與非關聯式資料庫的基本概念,闡述兩者的差異及各自的應用場景。文章進一步分析了 MySQL 的兩種主要儲存引擎:MyISAM與InnoDB,並探討了它們的優缺點及使用情境,幫助讀者瞭解選擇適合的資料庫引擎所需考量的因素。
本文分享了在面試演算法工程師時經常會遇到的問題及解題方法,包括複雜度分析、五大演算法的介紹、排序方法及動態規劃等。希望這些資訊能幫助求職者在面試時有更好的準備、提高自信,並提供參考資料以便深入學習相關內容。
本文介紹正規表達式的基本概念和常用符號,幫助讀者瞭解如何使用正規表達式來有效搜尋資料和程式碼。在數位時代,正規表達式成為了數據處理和程式開發中不可或缺的工具。透過示範和範例,讀者可以快速掌握正規表達式的基本語法,並應用於實際場景。
本文將介紹 RESTful API 的基本概念、特性及其在現代 Web 開發中的重要性。探討 REST 的設計理念,包括無狀態性、資源格式和 API 接口的最佳實踐,幫助工程師瞭解如何進行有效的 API 設計。
這篇文章介紹了git常用的幾個指令,包括分支合併、重製修改、修改紀錄等。另外也提到了一個好用的小工具tig。這些指令的使用方法和技巧都有詳細介紹,可以幫助讀者更好地使用git。
本文探討資料庫中的索引及其關鍵概念,涵蓋何謂索引、其類型與設立原因、索引失效情況及 B-tree 與 B+ tree 的差異,並簡要區分主鍵與外鍵的功能。瞭解索引的運作有助於提升資料查詢效率,並正確選擇適當的索引策略,以確保資料庫的高效運行。
本文介紹關聯式資料庫與非關聯式資料庫的基本概念,闡述兩者的差異及各自的應用場景。文章進一步分析了 MySQL 的兩種主要儲存引擎:MyISAM與InnoDB,並探討了它們的優缺點及使用情境,幫助讀者瞭解選擇適合的資料庫引擎所需考量的因素。
本文分享了在面試演算法工程師時經常會遇到的問題及解題方法,包括複雜度分析、五大演算法的介紹、排序方法及動態規劃等。希望這些資訊能幫助求職者在面試時有更好的準備、提高自信,並提供參考資料以便深入學習相關內容。
本文介紹正規表達式的基本概念和常用符號,幫助讀者瞭解如何使用正規表達式來有效搜尋資料和程式碼。在數位時代,正規表達式成為了數據處理和程式開發中不可或缺的工具。透過示範和範例,讀者可以快速掌握正規表達式的基本語法,並應用於實際場景。
本文將介紹 RESTful API 的基本概念、特性及其在現代 Web 開發中的重要性。探討 REST 的設計理念,包括無狀態性、資源格式和 API 接口的最佳實踐,幫助工程師瞭解如何進行有效的 API 設計。
這篇文章介紹了git常用的幾個指令,包括分支合併、重製修改、修改紀錄等。另外也提到了一個好用的小工具tig。這些指令的使用方法和技巧都有詳細介紹,可以幫助讀者更好地使用git。
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
一般在使用 TypeScript 的時候,大家都有遇過定義列舉資料的情境吧。 不過不管是 enum 和 literal 的方式其實都有些小缺點,以下推薦一個個人認為體驗更好的方式。
儲存庫 (Repository) 是檔案(File)的儲存區域。 在版本控制中,儲存庫是包含所有檔案的資料夾[1]。 每次改動檔案,你都可以選擇要不要儲存。 而那些有被處存的改動,就被稱為「提交 Commit」[2]。 而當一個儲存庫有多個開發者(Developer)在貢獻,
Thumbnail
為什麼會有Schema Registry的出現? 因為Kafka的零拷貝原則, 也就是kafka本身並不會去碰觸到訊息也不進行資料驗證, 而是bypass的傳送, 預設都以位元組來傳輸資料會比較有效率, 但位元組誰看得懂啊...。 加上Kafka的特性是生產者與消費者並不能直接溝通, 因
版本控制 (Version Control), 是一種追蹤檔案被更改歷史的技術, 是團隊合作必備的工作實務[1]。 我在博士一二年級時期, 比較像是單打獨鬥, 與合作的學弟妹也是一對一溝通, 可以維持同步,把研究成果做出來。 然而,當我到博士三年級以後,
Thumbnail
本章節旨在介紹 TypeScript 的基本資料型別,包括內建型別、型別轉換、自訂型別、元組、集合、陣列、和字典型別。透過理解和使用這些型別,可以提高代碼的可讀性和可維護性。
Thumbnail
工具功能 (1) 彈性任意查詢檔案,如對來源目錄設定,檔案修改日期 設定,檔名特定字串或副檔名設定後,自動查出明細,並可展開至各階子目錄處理     (2) 依查詢後結果,可產出 LIST ,提供查詢結果之確認,再依此對檔案作複 (3) 可對檔案作移動,複製至別處,刪除處理,使電腦可騰出硬碟空間
Thumbnail
題目敘述 題目會給我們一組定義好的界面和需求,要求我們設計一個資料結構,可以滿足平均O(1)的插入元素、刪除元素、隨機取得元素的操作。 RandomizedSet() 類別建構子 bool insert(int val) 插入元素的function界面 bool remove(int val
Thumbnail
※ 基本操作:SQL 語法,SELECT, WHERE, CREATE, UPDATE, DELETE。 SELECT:從資料庫中或資料表中指定要選擇的欄位中取得資料,稱之為查詢 (query)。 ※ 語法:要由兩部分構成,第一部分是要 "拿什麼" 資料 (若有多項用逗號隔開);第二部分則為
Migration在 Laravel 中是一種用來管理資料庫結構變更的機制。它的主要目的是使開發者能夠在應用程序的不同環境中保持資料庫結構的一致性,並輕鬆地進行結構變更
本課程學習如何添加 Room 資料庫相關依賴庫配置。
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
一般在使用 TypeScript 的時候,大家都有遇過定義列舉資料的情境吧。 不過不管是 enum 和 literal 的方式其實都有些小缺點,以下推薦一個個人認為體驗更好的方式。
儲存庫 (Repository) 是檔案(File)的儲存區域。 在版本控制中,儲存庫是包含所有檔案的資料夾[1]。 每次改動檔案,你都可以選擇要不要儲存。 而那些有被處存的改動,就被稱為「提交 Commit」[2]。 而當一個儲存庫有多個開發者(Developer)在貢獻,
Thumbnail
為什麼會有Schema Registry的出現? 因為Kafka的零拷貝原則, 也就是kafka本身並不會去碰觸到訊息也不進行資料驗證, 而是bypass的傳送, 預設都以位元組來傳輸資料會比較有效率, 但位元組誰看得懂啊...。 加上Kafka的特性是生產者與消費者並不能直接溝通, 因
版本控制 (Version Control), 是一種追蹤檔案被更改歷史的技術, 是團隊合作必備的工作實務[1]。 我在博士一二年級時期, 比較像是單打獨鬥, 與合作的學弟妹也是一對一溝通, 可以維持同步,把研究成果做出來。 然而,當我到博士三年級以後,
Thumbnail
本章節旨在介紹 TypeScript 的基本資料型別,包括內建型別、型別轉換、自訂型別、元組、集合、陣列、和字典型別。透過理解和使用這些型別,可以提高代碼的可讀性和可維護性。
Thumbnail
工具功能 (1) 彈性任意查詢檔案,如對來源目錄設定,檔案修改日期 設定,檔名特定字串或副檔名設定後,自動查出明細,並可展開至各階子目錄處理     (2) 依查詢後結果,可產出 LIST ,提供查詢結果之確認,再依此對檔案作複 (3) 可對檔案作移動,複製至別處,刪除處理,使電腦可騰出硬碟空間
Thumbnail
題目敘述 題目會給我們一組定義好的界面和需求,要求我們設計一個資料結構,可以滿足平均O(1)的插入元素、刪除元素、隨機取得元素的操作。 RandomizedSet() 類別建構子 bool insert(int val) 插入元素的function界面 bool remove(int val
Thumbnail
※ 基本操作:SQL 語法,SELECT, WHERE, CREATE, UPDATE, DELETE。 SELECT:從資料庫中或資料表中指定要選擇的欄位中取得資料,稱之為查詢 (query)。 ※ 語法:要由兩部分構成,第一部分是要 "拿什麼" 資料 (若有多項用逗號隔開);第二部分則為
Migration在 Laravel 中是一種用來管理資料庫結構變更的機制。它的主要目的是使開發者能夠在應用程序的不同環境中保持資料庫結構的一致性,並輕鬆地進行結構變更
本課程學習如何添加 Room 資料庫相關依賴庫配置。