首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 數據庫設計規範五大核心原則:從 1NF 到 BCNF 的工程落地指南

     編輯:Oracle 資料庫基礎

前言

數據庫設計規範化是數據完整性、性能穩定、維護可控的基石。本文提煉工程實踐中的五大核心原則,結合 Oracle 特性 (空值處理、行遷移、分區、命名規範) 給出可落地的設計標準,並說明何時為性能適度反規範化。

原則一:消除空值列

痛點

  • Oracle 空值不進入標準 B*Tree 索引,導致 WHERE col IS NULL 全表掃描。
  • 空值參與運算/比較結果為 UNKNOWN,邏輯陷阱多。
  • 大量空值列增加行長度、觸發行遷移、降低緩存效率。

解決方案

  1. 默認值策略:業務允許時,定義有意義默認值。
    id_card_no VARCHAR2(18) DEFAULT 'UNKNOWN' NOT NULL
  2. 垂直拆分 (副表):空值列 > 30% 且稀疏訪問,拆至子表 1:1 關聯。
    CREATE TABLE emp_ext (emp_id PK, id_card_no, passport_no, ...) -- 稀疏屬性
  3. 稀疏列優化 (12c+):CREATE TABLE t (col VARCHAR2(100) DEFAULT 'N/A' NOT NULL) 實際不存儲默認值元數據,節省空間。

原則二:消除重複值/重複列 (嚴格 1NF)

反模式

-- 錯誤:聯系人扁平化
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
);

收益

  • 聯系人數量無上限,無需 DDL 變更。
  • 歷史變更可追溯 (聯系人生效/失效日期)。
  • 避免大量空值、行遷移、UPDATE 連鎖修改歷史單據。

原則三:每張表必須有代理主鍵

鐵律

  1. 單列數字型:ID NUMBER GENERATED BY DEFAULT AS IDENTITY (12c+) / SEQUENCE + TRIGGER (11g)。
  2. 無業務含義:不隨業務變更而變更。
  3. 唯一約束:業務自然鍵 (如訂單號、身份證) 加 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_IDPK_ 系統自動生成
序列SEQ_SEQ_ORDER_ID
觸發器TRG_TRG_ORDER_BIURBIUR: Before Insert/Update/Delete Row
包/過程/函數PKG_ / PRC_ / FUNC_PKG_ORDER_MGMT
同義詞SYN_SYN_MATERIAL
物化視圖MV_MV_DAILY_SALES
分區表T_..._PARTT_ORDER_PART可選

模塊代碼 (2-3 字母)

MAT - 物料/庫存    ORD - 訂單/銷售    CRM - 客戶關系
FIN - 財務/會計    HR  - 人力資源     SYS - 系統管理
PRD - 生產/製造    PUR - 採購/供應鏈  QMS - 質量管理

全名示例:T_ORD_ORDER_HDR, IDX_ORD_ORDER_HDR_CUST_ID, PKG_ORD_ORDER_PROCESS。

原則五:單一實體類型原則 (核心 3NF/BCNF)

反模式:圖書與作者合表

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 緩存熱點行分片鍵選擇、分佈式事務/最終一致性
歷史數據不可變審計審計表冗余完整業務快照僅寫入、不修改、分區歸檔

Oracle 特有物理設計檢查清單

  1. 表空間分離:DATA (表)、INDEX (索引)、LOB (大對象)、TEMP (排序)、UNDO (回滾)、SYSAUX (輔助)。
  2. 分區策略:範圍分區 (時間)、列表分區 (地區/狀態)、哈希分區 (均勻分佈)、間隔分區 (11g+ 自動擴展)。
  3. 壓縮:COMPRESS FOR OLTP (11g+)、HYBRID COLUMN COMPRESS (HCC) (Exadata/存儲設備)。
  4. LOB 存儲:SECUREFILE (11g+)、CACHE/NO CACHE、DEDUPLICATE、COMPRESS。
  5. 索引組織表 (IOT):窄表、主鍵訪問佔 90%+、無二級索引或極少。
  6. 約束狀態:ENABLE VALIDATE (默認)、ENABLE NOVALIDATE (大表加載後驗證)、DISABLE (維護窗口)。

結語

規範化不是教條,而是「用最小的冗余描述業務真相」的工程藝術。堅守五大原則 (無空值、無重複、代理鍵、統一命名、單一實體) 建立核心模型,再針對性能熱點、報表需求、歷史審計做有紀律、可追溯、可逆轉的適度反規範化。Oracle 提供分區、壓縮、IOT、MV、SecureFile 等豐富物理特性支撐落地。設計評審時,問三個問題:這個冗余解決了什麼性能問題?一致性如何保證?未來如何回滾? 能答清,才敢上線。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved