關聯式資料庫設計 1
學習關聯式資料庫設計
August 20, 2026在從事前端工程的這段時間中,跟後端的協作多半來自串接 API,對於後端在資料庫設計,資料表的欄位設計等沒有著墨太深,只知道資料庫設計跟效能上也有很大的關係。 這系列可能不會涉及太深或太複雜的資料庫設計,多半是我為了釐清學習過程中的問題以及複習的文字紀錄。
課程: Udemy - Relational Database Design Bootcamp
在開始之前,想先彙整一些資料庫設計會用到的台灣繁體中文翻譯跟英文對照。
| 英文 | 台灣繁體中文 |
|---|---|
| Entitiy | 實體 |
| Cloumn | 行 |
| Row | 列 |
| NoSQL DB | 非關聯式資料庫 |
| RDB | 關聯式資料庫 |
| RDBMS | 關聯式資料庫管理系統 |
| Primary Key | 主鍵 |
| 1NF | 第一正規化 |
不一樣的資料庫類別
在第一部分 Introduction of Database Design,講師透過簡報說明資料庫以及資料庫設計的一些概要與原則。
平面檔案資料庫 (Flat File DB)
簡易的資料庫,所有資料儲存在單一表格或是試算表,適用於規模較小的資料集,常見的有 CSV, TXT。
非關聯式資料庫 (NoSQL DB)
專為非結構化或半結構化資料設計,適用於大規模或快速變化的資料,市場常見的有 MongoDB, Cassandra。
關聯式資料庫 (RDB)
一種將資料組成由行和列組成的表(即「關係」)的資料庫
- 每張表代表一個不同的實體(如藝術家、客戶等)
- 每一列是一筆記錄,每一行是一個欄位或屬性
- 可在不同表之間建立關係,以關聯相關資料
- 提升資料的可靠性與完整性
好的表格 vs. 壞的表格
一張表格有固定的結構,基本原則如下:
- 行與列:構成資料表的基本網格,分別代表屬性(Attributes)與記錄(Records)。
- 主鍵:確保資料表中的每一筆紀錄都有獨一無二的識別方式。
- 資料型態:限制欄位內只能儲存特定型態的值,維持資料一致性。
- 原子性):確保每個儲存格(欄位值)皆為不可分割的單一值,這正是修正前一個例子中 playlists 欄位夾雜多個值的關鍵所在。
範例
不符合資料庫設計結構的表格
| first_name | last_name | date_of_birth | state | country | playlists |
|---|---|---|---|---|---|
| Andrew | Smith | 1998-03-11 | Wisconsin | USA | Easy Listening |
| Michael | Portman | Dec 3rd 1995 | New Hampshire | USA | best of 2024, best of 2025 |
| Joseph | Samuel | 2003-07-20 | New York | USA | 90's classics |
符合資料庫設計結構的表格
| sb_id | first_name | last_name | date_of_birth | state | country |
|---|---|---|---|---|---|
| 1 | Andrew | Smith | 1998-03-11 | Wisconsin | USA |
| 2 | Michael | Portman | 2000-09-15 | New Hampshire | USA |
| 3 | Joseph | Samuel | 2003-07-20 | New York | USA |
從不符合設計結構的表格來看,它主要違反了:
- 未達成原子性:
playlists欄位中儲存了多個以逗號分隔的值(例如:best of 2024, best of 2025)。在 1NF 的規範下,每個欄位都必須是不可分割的單一值(即原子值),不能在同一個欄位內塞入多個資料。date_of_birth欄位格式不一致(例如:Dec 3rd 1995 與標準的 YYYY-MM-DD 格式不同),這也會導致資料型態不一致與後續查詢、排序上的困難。
- 無主鍵
資料庫設計目標
這邊是概念的部分,我覺得可以記一下,然後去對照資料庫是否有違反設計原則,再來思考怎麼最佳化。
促進資料完整性與可靠性
涉及資料庫中所儲存資料的準確性、一致性和可靠性。
- 確保資料在任何時間(插入、更新、刪除操作期間)均保持正確且有效。
- 透過規則、約束和通用實踐來強制執行。
- 確保表中的每筆記錄都能被唯一標識,並防止重複記錄。
- 確保資料庫中的關聯資料能夠被正確引用。
- 防止邏輯錯誤,並確保使用者能夠信賴這些資料來進行決策。
最小化資料冗餘
- 避免在資料庫的多個位置重複存放相同的資料
- 節省儲存空間並降低資料不一致的風險
維護性與可擴展性
- 讓資料庫更容易進行更新、修改與擴充,且不會破壞現有的功能
- 針對未來資料量與使用者負載的成長進行設計
有效率的資料存取與查詢效能
- 規劃資料表與索引的結構,以支援快速且有效率的資料檢索
安全性與存取控制
- 定義角色與權限來控管誰能檢視或修改資料
- 使用檢視(Views)來限制對敏感資料的存取
考量業務與邏輯
- 在資料庫設計中捕捉並強制執行與業務領域相關的規則和邏輯
- 設計資料庫以適應未來的變更,而無需進行重大重新設計