前言
資料庫設計是資訊系統成敗的基石。本文彙整 14 大核心技巧,涵蓋**實體識別、鍵值設計、範式權衡、關聯處理、視圖應用、完整性約束、三少原則、效能優化**等全生命週期關鍵決策點,助您建立高內聚、低耦合、可擴展的資料架構。
技巧 1:原始單據與實體的對應關係
- **一對一** (最常見):單據 ↔ 基本表
- **一對多**:單據拆解為多基本表 (如員工履歷 → 基本資料/社會關係/工作簡歷 三表)
- **多對一**:多單據匯聚為一實體
- **指導原則**:明確對應關係 → 設計錄入介面、驗證邏輯、ETL 流程
技巧 2:主鍵 (PK) 與外鍵 (FK) 設計鐵律
- 葉子實體 (無子實體) **可無 PK,但必有 FK** (指向父實體)
- 非葉子實體 **必有 PK** (被子實體 FK 參考)
- 專家名言:「鍵,到處都是鍵,除了鍵之外,什麼也沒有」— PK 抽象實體,PK-FK 配對表達實體連接
技巧 3:基本表四大本質特徵
| 特徵 | 定義 | 設計含義 |
| 原子性 | 欄位不可再分解 | 拒絕多值欄位、複合欄位 (如「姓名」拆「姓/名」) |
| 原始性 | 記錄為基礎原始資料 | 非衍生、非彙總、非暫存 |
| 演繹性 | 配合代碼表可演繹所有輸出 | 基本表 + 代碼表 = 系統完整資訊來源 |
| 穩定性 | 結構相對穩定、長期保存 | 變動需嚴格變更控制,區別於中介/暫存表 |
技巧 4:範式標準與刻意違反
- **目標**:基本表滿足 3NF (無傳遞相依)
- **現實**:為效能**刻意降範式** (增加冗余欄位),以空間換時間
- **範例**:商品表保留
Amount = Price * Qty — 違反 3NF,但查詢統計無需運算
- **工具支援**:Rose/PowerDesigner 區分「資料欄」與「計算欄」
- **策略**:概念模型遵守 3NF,物理模型視效能降範式
技巧 5:三大範式通俗理解
- **1NF**:欄位原子性,不可再分
- **2NF**:記錄唯一性,實體有單一識別碼 (PK)
- **3NF**:欄位無冗余,非鍵欄位不傳遞相依於 PK
技巧 6:識別與消除多對多關聯
- **識別**:兩實體互為多對多 (如 圖書 ↔ 讀者)
- **消除**:引入**關聯實體** (如 借還書),轉為兩個一對多
- **屬性分配**:關聯實體包含雙方 PK (成為 FK)、關聯屬性 (借閱時間、歸還標記)
- **工具提示**:建模工具通常**無法自動識別**多對多,需設計師主動發現
技巧 7:主鍵取值策略
- **推薦**:無業務意義的代理鍵 (Surrogate Key) —
IDENTITY、SEQUENCE、NEWSEQUENTIALID()
- **避免**:複合主鍵 (超過 2~3 欄位) — 索引膨脹、連接條件冗長、FK 傳播導致子表鍵值過長
- **業務鍵**:以唯一條件約束 (Unique Constraint) 保護,不作 PK
技巧 8:正確認知資料冗余
| 類型 | 定義 | 範例 | 態度 |
| 低級冗余 (重複性) | 非鍵欄位在多表重複儲存 | 多表存「客戶名稱」 | **堅決反對** — 導致不一致 |
| 高級冗余 (衍生性) | 欄位由其他欄位衍生計算 | Amount = Price * Qty | **提倡** — 以空間換查詢速度 |
**核心**:PK/FK 在多表重複 **不算冗余**,那是關聯機制。
技巧 9:ER 圖無標準答案,但有優劣標準
- 覆蓋業務範圍與功能即可行
- **優秀 ER 圖標準**:結構清晰、關聯簡潔、實體數適中、屬性分配合理、無低級冗余
技巧 10:視圖技術在設計中的戰略價值
- **虛擬表**:依賴基表存在,不佔儲存 (索引檢視表除外)
- **四大角色**:程式存取窗口、基表資料綜合形式、運算加速手段、資料保密屏障
- **深度限制**:定義深度 ≤ 3 層;不足時 → 視圖上建暫存表 → 再建視圖,迭代繞過限制
- **安全模式**:高機密系統 → 基表完成物理設計 → 立即建立 1:1 視圖層 → **程式員僅操作視圖**,DBA 持多重金鑰操作基表
技巧 11:中介表、報表、暫存表分工
| 類型 | 用途 | 維護者 | 鍵值 |
| 中介表 | 統計資料、資料倉庫、報表輸出 | DBA | 視需求 (倉庫需 PK/FK) |
| 報表表 | 特定報表快取 | DBA/開發 | 通常無 |
| 暫存表 | 程式員個人暫存運算中間結果 | 程式員 (程式自動建刪) | 無 |
技巧 12:完整性約束三層實現
- **域完整性**:
CHECK 約束、DEFAULT、資料型別、NOT NULL — 工具中對欄位定義取值範圍
- **參考完整性**:PK/FK、表級觸發器 (跨表複雜規則)
- **使用者定義完整性**:業務規則 — **預存程序** (複雜驗證/流程)、**觸發器** (資料級強制規則)
技巧 13:防止打補丁設計 — 「三少原則」
| 原則 | 內容 | 效益 |
| 表少 | 資料庫表數越少越好 | ER 圖少而精、去重整合、防止孤島、減少打補丁 |
| 組合鍵少 | 複合主鍵欄位數越少越好 | 索引小、連接快、FK 傳播輕量 |
| 欄位少 | 單表欄位數越少越好 | 無重複/冗余、強迫「列轉行」正規化、防止主表殘留大量空值欄位 |
**核心洞見**:「三少」是**系統級資料整合**的指導原則 — 文件系統 → 單一應用資料庫 → 主題資料庫 → 全域綜合資料庫。整合程度越高,共享性越強,孤島越少,實體/屬性總數越少。
**反模式**:「三多」 = 打補丁設計 → 垃圾堆/大雜院 → 系統癱瘓無法維護。
技巧 14:提升資料庫執行效率的三層優化
- 系統級:DBMS 參數調優 (緩衝區、執行緒、平行度、鎖定升級閾值)
- 設計級:
- 適度降範式、增加高級冗余
- 少用觸發器,多用預存程序 (計畫重用、批次處理)
- 超大表水平分割 (按 PK 範圍/時間/雜湊) / 垂直分割 (熱/冷欄位分離)
- 分區表/分區索引 (Enterprise Edition)
- 程式實現級:
- 極複雜/超大量運算 (千萬列+) → **資料庫外運算** (C++/Python/檔案系統) → 最後批次載入
- SQL 語句優化:索引覆蓋、避免隱性轉換、參數化、窗口函數替代游標
總結
資料庫設計的實用鐵律:**在冗余與速度間尋找平衡點**。「三少」不是教條,而是**整合導向的架構審視鏡**。優秀設計師能在概念模型嚴守 3NF、物理模型精準降範式、視圖層構建安全與效能雙重保障、程式層發揮集合運算極致效能。將這 14 大技巧內化為設計直覺,並在每個專案中以檢查清單形式落地,方能構建經得起時間考驗的資料資產。
- 上一篇文章: 從演算法到 SQL 實作:集合思維重構複雜業務規則的三大經典案例
- 下一篇文章: SQL Server 安全強化五步走:從補丁管理到審計監控的系統化防禦體系
Copyright ©
程式碼之家 All Rights Reserved