數據庫設計規範化是數據完整性、性能穩定、維護可控的基石。本文提煉工程實踐中的五大核心原則,結合 Oracle 特性 (空值處理、行遷移、分區、命名規範) 給出可落地的設計標準,並說明何時為性能適度反規範化。
WHERE col IS NULL 全表掃描。id_card_no VARCHAR2(18) DEFAULT 'UNKNOWN' NOT NULLCREATE TABLE emp_ext (emp_id PK, id_card_no, passport_no, ...) -- 稀疏屬性CREATE TABLE t (col VARCHAR2(100) DEFAULT 'N/A' NOT NULL) 實際不存儲默認值元數據,節省空間。-- 錯誤:聯系人扁平化
CREATE TABLE customer (
cust_id PK, name,
contact1_name, contact1_phone, contact1_role,
contact2_name, contact2_phone, contact2_role,
contact3_name, contact3_phone, contact3_role ...
);
CREATE TABLE customer (cust_id PK, name, ...);
CREATE TABLE contact (
contact_id PK,
cust_id FK REFERENCES customer,
name, phone, role, -- role: 'PURCHASING', 'WAREHOUSE', 'FINANCE'
is_primary FLAG
);
ID NUMBER GENERATED BY DEFAULT AS IDENTITY (12c+) / SEQUENCE + TRIGGER (11g)。UNIQUE 索引,不作主鍵。CREATE TABLE sales_order_line (
line_id NUMBER GENERATED AS IDENTITY PK, -- 代理主鍵
order_id NUMBER FK REFERENCES sales_order,
line_num NUMBER(5,0) DEFAULT 10, -- 業務行號:10, 20, 30...
product_id, qty, price, ...
);
-- 插入新行到第 2 位:UPDATE SET line_num=15 WHERE line_num>=20; INSERT line_num=15;
-- 排序永遠 ORDER BY line_num
優勢:主鍵穩定不變,業務排序靈活可控,應用層無需操作主鍵。
| 對象類型 | 前綴 | 示例 | 說明 |
|---|---|---|---|
| 表 | T_ / 無 (核心表) | T_MATERIAL, T_ORDER | 核心業務表可無前綴 |
| 視圖 | V_ | V_ORDER_DETAIL | |
| 索引 | IDX_ / PK_ / UK_ / FK_ | IDX_ORDER_CUST_ID | PK_ 系統自動生成 |
| 序列 | SEQ_ | SEQ_ORDER_ID | |
| 觸發器 | TRG_ | TRG_ORDER_BIUR | BIUR: Before Insert/Update/Delete Row |
| 包/過程/函數 | PKG_ / PRC_ / FUNC_ | PKG_ORDER_MGMT | |
| 同義詞 | SYN_ | SYN_MATERIAL | |
| 物化視圖 | MV_ | MV_DAILY_SALES | |
| 分區表 | T_..._PART | T_ORDER_PART | 可選 |
MAT - 物料/庫存 ORD - 訂單/銷售 CRM - 客戶關系
FIN - 財務/會計 HR - 人力資源 SYS - 系統管理
PRD - 生產/製造 PUR - 採購/供應鏈 QMS - 質量管理
全名示例:T_ORD_ORDER_HDR, IDX_ORD_ORDER_HDR_CUST_ID, PKG_ORD_ORDER_PROCESS。
CREATE TABLE book_author (
book_id, book_title, author_id, author_name, author_address, author_phone
);
-- 問題:作者地址變更需更新所有書;刪除書導致作者信息丟失;存儲膨脹
CREATE TABLE book (book_id PK, title, isbn, pub_date, ...);
CREATE TABLE author (author_id PK, name, address, phone, ...);
CREATE TABLE book_author (book_id FK, author_id FK, role, PRIMARY KEY (book_id, author_id));
「一個表只描述一類事物的屬性;多對多關係抽獨立關聯表;屬性依賴整個鍵、僅依賴鍵。」
| 場景 | 手段 | 風險控制 |
|---|---|---|
| 高頻 JOIN 大表 (維度表) | 關鍵屬性冗余到事實表 (如 customer_name 進 order 表) | 觸發器/應用層同步更新、定期校驗一致性 Job |
| 報表/OLAP 多維分析 | 星型/雪花模型、物化視圖、預聚合表 | ETL 窗口重建、查詢改寫導向 MV |
| 極高併發單表熱點 | 水平分表/分庫、Redis 緩存熱點行 | 分片鍵選擇、分佈式事務/最終一致性 |
| 歷史數據不可變審計 | 審計表冗余完整業務快照 | 僅寫入、不修改、分區歸檔 |
COMPRESS FOR OLTP (11g+)、HYBRID COLUMN COMPRESS (HCC) (Exadata/存儲設備)。SECUREFILE (11g+)、CACHE/NO CACHE、DEDUPLICATE、COMPRESS。ENABLE VALIDATE (默認)、ENABLE NOVALIDATE (大表加載後驗證)、DISABLE (維護窗口)。規範化不是教條,而是「用最小的冗余描述業務真相」的工程藝術。堅守五大原則 (無空值、無重複、代理鍵、統一命名、單一實體) 建立核心模型,再針對性能熱點、報表需求、歷史審計做有紀律、可追溯、可逆轉的適度反規範化。Oracle 提供分區、壓縮、IOT、MV、SecureFile 等豐富物理特性支撐落地。設計評審時,問三個問題:這個冗余解決了什麼性能問題?一致性如何保證?未來如何回滾? 能答清,才敢上線。