資料庫正規化(關聯式資料庫的基礎與最佳實踐)

更新於 2024/12/08閱讀時間約 6 分鐘

在當今的軟體開發與資料管理中,資料庫是不可或缺的一部分。無論是 MySQL、PostgreSQL、Oracle 還是 SQL Server,這些都是常見的關聯式資料庫系統,幫助我們管理結構化資料。今天,我們將深入探討 資料庫正規化 的概念,並了解如何利用它來提升資料庫的效能與可維護性。


什麼是關聯式資料庫?

在了解資料庫正規化之前,我們需要先明白什麼是 關聯式資料庫。關聯式資料庫是以「表格」形式來儲存資料,每個表格由多列(記錄)和多欄(欄位)組成。這些資料表彼此之間通常會透過外鍵(Foreign Key, FK)來建立關聯。這種方式讓資料庫能夠組織並管理大量的資料。

常見的關聯式資料庫:

  • MySQL:目前由甲骨文公司(Oracle)所擁有,但仍然是一個開源資料庫系統。
  • MariaDB:MySQL 的分支,也是開源的,並且在 MySQL 之後有一些進一步的功能強化。
  • PostgreSQL:以其強大的擴展性與符合 SQL 標準而聞名。
  • SQL Server:微軟的資料庫解決方案,廣泛應用於企業環境中。

什麼是資料庫正規化?

資料庫正規化(Database Normalization)是一種設計資料庫結構的過程,目的是通過消除資料冗餘和確保資料的一致性來提高資料庫的效能。它有助於避免資料異常,從而提高資料庫的可維護性。

正規化的主要目的:

  1. 減少資料冗餘:避免資料重複存儲,節省空間並提升效能。
  2. 提升資料一致性:確保資料的正確性與完整性,避免不一致的資料。
  3. 提高查詢效率:透過清晰的結構設計,提高查詢效能。

資料庫正規化通常有五個階段,稱為 正規化形式(Normal Forms, NF)。但大多數應用只會使用前三個正規化形式。接下來,我們來詳細了解這三個階段吧。


第一正規化(1NF)—— 資料的基本結構化

第一正規化(1NF) 的目的是將資料表中的資料拆解成更小的單位,並確保每一個欄位只有一個值。這樣不僅讓資料更加清晰,也避免了資料表中可能出現的重複或錯誤資料。

1NF 要求:

  1. 每個欄位只能有一個值:避免有欄位存放多個值,像是列表或陣列。例如,將顧客的多個電話號碼分開存儲,而不是將它們放在同一欄位中。
  2. 每筆資料須有唯一標識:每一筆記錄必須有一個唯一的標識符,這通常是 主鍵(Primary Key, PK)
  3. 資料表中的每筆資料不能完全相同:每一筆資料必須是唯一的。

範例:

假設我們有一個儲存顧客資料的資料表,原始資料可能長這樣:

顧客ID顧客名稱顧客電話1張三0912345678, 09223334442李四0955555555

為了符合1NF,我們需要將顧客的多個電話號碼拆分到不同的列中:

顧客ID顧客名稱顧客電話1張三09123456781張三09223334442李四0955555555


第二正規化(2NF)—— 消除重複資料

第二正規化(2NF) 的目的是進一步消除資料表中的冗餘資料。要達到2NF,資料表必須先符合 1NF,並且每個非主鍵欄位都必須完全依賴於 主鍵

2NF 要求:

  1. 滿足1NF的要求
  2. 消除部分依賴:如果資料表的某個欄位僅依賴於主鍵的一部分,而不是整個主鍵,則需要將這些欄位拆分到新的資料表中。

範例:

假設我們有一個儲存訂單資料的資料表,記錄了顧客訂單的商品及價格。原始資料可能長這樣:

訂單ID顧客ID商品名稱商品價格顧客名稱11筆電30000張三22手機15000李四

在這個表中,顧客名稱 依賴於 顧客ID,而不是整個主鍵(訂單ID, 顧客ID)。因此,應該將顧客名稱移到一個新的顧客資料表,來消除重複。


第三正規化(3NF)—— 移除依賴資料

第三正規化(3NF) 旨在進一步消除不必要的依賴關係。如果某個欄位不依賴於主鍵,而依賴於其他非主鍵欄位,那麼這些欄位應該移到其他資料表中。

3NF 要求:

  1. 符合2NF
  2. 消除傳遞依賴:如果欄位 A 依賴於欄位 B,欄位 B 又依賴於欄位 C,則欄位 A 也間接依賴於欄位 C。在這種情況下,我們需要將這些欄位分開。

範例:

假設我們有一個儲存員工資料的資料表,其中包含員工的 部門名稱部門負責人,原始資料可能長這樣:

員工ID員工名稱部門名稱部門負責人1王五IT張總2趙六HR李總

在這裡,部門負責人 是依賴於 部門名稱,而不是直接依賴於主鍵(員工ID)。因此,我們應該將 部門名稱部門負責人 分開到另一個表格中:

新的資料表設計:

員工表格

員工ID員工名稱部門ID1王五12趙六2

部門表格

部門ID部門名稱部門負責人1IT張總2HR李總

這樣,我們就消除了部門負責人對部門名稱的依賴,符合3NF。


結語

有沒有覺得資料庫正規化可以讓資料更清楚呢?資料庫正規化是一項重要的資料庫設計技術,有助於提升資料庫的結構性、維護性以及效能喔。理解並實踐1NF、2NF和3NF將幫助開發者更有效地管理資料,並確保資料庫的正確性與一致性。隨著資料庫設計的複雜性增加,正規化的過程將成為成功實現穩定資料管理的關鍵步驟。接下來會介紹SQL語法。


對於這類的撰寫方式習慣嗎?歡迎多多進行良性的知識交流喔!目前是在學習階段,大家有不同看法的話歡迎進行良性的知識交流!

 

大家可以考慮多多分享文章和考慮訂閱沙龍方案或贊助等喔!不過請注意不要違反著作權等行為。當然決定權都在於您,不會干涉您的任何決定。

 

提醒,文章僅供正當的知識參考,文章不負任何責任。

avatar-img
0會員
18內容數
有軟體開發相關文章。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
你可能也想看
Google News 追蹤
Thumbnail
本文探討了複利效應的重要性,並藉由巴菲特的投資理念,說明如何選擇穩定產生正報酬的資產及長期持有的核心理念。透過定期定額的投資方式,不僅能減少情緒影響,還能持續參與全球股市的發展。此外,文中介紹了使用國泰 Cube App 的便利性及低手續費,幫助投資者簡化投資流程,達成長期穩定增長的財務目標。
Thumbnail
※ 為什麼選擇SQLite? 安裝簡單:SQLite是一個零配置的資料庫,不需要複雜的設定和安裝過程。。 使用SQL語法。 設計選擇多元性(MySQL / SQLite):適合於小零件資料應用、嵌入式系統、物聯網設備。 ※ SQLite四大優點: 執行檔檔案很小:資料庫系統需要的磁碟空
版本控制 (Version Control), 是一種追蹤檔案被更改歷史的技術, 是團隊合作必備的工作實務[1]。 我在博士一二年級時期, 比較像是單打獨鬥, 與合作的學弟妹也是一對一溝通, 可以維持同步,把研究成果做出來。 然而,當我到博士三年級以後,
※ 生產者和消費者模式 定義: 生產者和消費者在同一時間內共同存取某一個資料空間。生產者負責生成數據並將其放入共享空間,消費者負責從共享空間中取走數據進行處理。兩者之間互不相干,也不須互相知道對方的存在。 共同存取資料空間:生產者和消費者共享同一個資料空間。這個空間通常是緩衝區或隊列,用於在它
Thumbnail
工具功能 (1) 彈性任意查詢檔案,如對來源目錄設定,檔案修改日期 設定,檔名特定字串或副檔名設定後,自動查出明細,並可展開至各階子目錄處理     (2) 依查詢後結果,可產出 LIST ,提供查詢結果之確認,再依此對檔案作複 (3) 可對檔案作移動,複製至別處,刪除處理,使電腦可騰出硬碟空間
Thumbnail
本篇說明如何利用Kubernetes特色,將PostgreSQL DB以HA的架構來提供服務,並說明相關的實作流程與說明。
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
本文探討了複利效應的重要性,並藉由巴菲特的投資理念,說明如何選擇穩定產生正報酬的資產及長期持有的核心理念。透過定期定額的投資方式,不僅能減少情緒影響,還能持續參與全球股市的發展。此外,文中介紹了使用國泰 Cube App 的便利性及低手續費,幫助投資者簡化投資流程,達成長期穩定增長的財務目標。
Thumbnail
※ 為什麼選擇SQLite? 安裝簡單:SQLite是一個零配置的資料庫,不需要複雜的設定和安裝過程。。 使用SQL語法。 設計選擇多元性(MySQL / SQLite):適合於小零件資料應用、嵌入式系統、物聯網設備。 ※ SQLite四大優點: 執行檔檔案很小:資料庫系統需要的磁碟空
版本控制 (Version Control), 是一種追蹤檔案被更改歷史的技術, 是團隊合作必備的工作實務[1]。 我在博士一二年級時期, 比較像是單打獨鬥, 與合作的學弟妹也是一對一溝通, 可以維持同步,把研究成果做出來。 然而,當我到博士三年級以後,
※ 生產者和消費者模式 定義: 生產者和消費者在同一時間內共同存取某一個資料空間。生產者負責生成數據並將其放入共享空間,消費者負責從共享空間中取走數據進行處理。兩者之間互不相干,也不須互相知道對方的存在。 共同存取資料空間:生產者和消費者共享同一個資料空間。這個空間通常是緩衝區或隊列,用於在它
Thumbnail
工具功能 (1) 彈性任意查詢檔案,如對來源目錄設定,檔案修改日期 設定,檔名特定字串或副檔名設定後,自動查出明細,並可展開至各階子目錄處理     (2) 依查詢後結果,可產出 LIST ,提供查詢結果之確認,再依此對檔案作複 (3) 可對檔案作移動,複製至別處,刪除處理,使電腦可騰出硬碟空間
Thumbnail
本篇說明如何利用Kubernetes特色,將PostgreSQL DB以HA的架構來提供服務,並說明相關的實作流程與說明。
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 資料庫相關依賴庫配置。