符合此二者,通常達到 3NF 以上。具體執行層面需遵循五大要求,本文詳細闡述前兩條。
IS NULL 不走普通 B*Tree 索引),增加解析與執行開銷。NULL 邏輯(NVL、COALESCE),代碼複雜度上升。-- 身份證號可能暫無,默認 'UNKNOWN' 而非 NULL
ALTER TABLE employee MODIFY (id_card DEFAULT 'UNKNOWN' NOT NULL);
NOT NULL 列全表掃描可用索引快速全掃描)。場景:表 30 列,其中 10 列稀疏填充(< 10% 非空)。
-- 主表:核心高頻屬性
CREATE TABLE emp_core (
emp_id NUMBER PRIMARY KEY,
name VARCHAR2(30) NOT NULL,
dept_id NUMBER NOT NULL,
hire_date DATE NOT NULL
);
-- 副表:稀疏擴展屬性
CREATE TABLE emp_ext (
emp_id NUMBER PRIMARY KEY REFERENCES emp_core(emp_id),
id_card VARCHAR2(18),
emergency_contact VARCHAR2(50),
-- ... 其他稀疏列
);
LEFT JOIN,空值天然不佔用空間(無行即無存儲)。CREATE VIEW v_emp AS SELECT ... FROM emp_core LEFT JOIN emp_ext USING (emp_id) 對應用透明。-- 錯誤設計:客戶聯系人展開為多列
CREATE TABLE customer_bad (
cust_id NUMBER PRIMARY KEY,
contact1_name VARCHAR2(30), contact1_phone VARCHAR2(20), contact1_role VARCHAR2(20),
contact2_name VARCHAR2(30), contact2_phone VARCHAR2(20), contact2_role VARCHAR2(20),
contact3_name VARCHAR2(30), contact3_phone VARCHAR2(20), contact3_role VARCHAR2(20),
-- 聯系人增加需 ALTER TABLE,歷史聯系人覆蓋導致訂單追溯失真
);
弊端:結構僵化、空值多、歷史追溯失真、頻繁 DDL 變更。
CREATE TABLE customer (
cust_id NUMBER PRIMARY KEY,
name VARCHAR2(100) NOT NULL
);
CREATE TABLE customer_contact (
contact_id NUMBER PRIMARY KEY,
cust_id NUMBER NOT NULL REFERENCES customer(cust_id),
contact_name VARCHAR2(30) NOT NULL,
phone VARCHAR2(20),
role VARCHAR2(20), -- '採購'、'倉庫'、'財務'
start_date DATE DEFAULT SYSDATE,
end_date DATE, -- 歷史保留,不覆蓋
is_primary NUMBER(1) DEFAULT 0
);
end_date 標記離職),訂單關聯 contact_id 永不失真。is_primary 標記,查詢高效。CREATE TABLE product_dev (
product_id NUMBER REFERENCES product(id),
emp_id NUMBER REFERENCES employee(id),
role VARCHAR2(20), -- '主開'、'協作'、'審核'
PRIMARY KEY (product_id, emp_id)
);
規範化本質是將多值屬性、稀疏屬性拆分為獨立實體,通過外鍵關聯與視圖封裝,換取結構彈性、查詢性能與數據真實性的長期收益。