隨著企業數據量爆發式增長,關係型資料庫(如 SQL Server、Oracle、DB2)已成為核心數據存儲引擎。無論前端採用 C/S 還是 B/S 架構,後端資料庫設計的合理性直接決定系統性能與可維護性。本文針對 SQL Server 環境,深入探討表主鍵設計的常見誤區與優化策略。
以銷售系統為例:主表 SalesOrder 以單據號為主鍵;明細表 SalesDetail 需包含單據號與商品編碼組成聯合主鍵。若業務進一步細分(如同一商品不同價格策略),第三張表甚至需引入前兩表的所有鍵值,形成三級甚至多級聯合主鍵。
採用無業務含義的單一自增整數(IDENTITY)或 GUID作為主鍵(代理鍵),業務唯一性通過 UNIQUE 約束或唯一索引保證。
-- 主表
CREATE TABLE SalesOrder (
OrderID INT IDENTITY(1,1) PRIMARY KEY, -- 代理鍵
OrderNo VARCHAR(20) NOT NULL UNIQUE, -- 業務單號
TotalAmount MONEY,
...
);
-- 明細表
CREATE TABLE SalesDetail (
DetailID INT IDENTITY(1,1) PRIMARY KEY, -- 代理鍵
OrderID INT NOT NULL REFERENCES SalesOrder(OrderID), -- 外鍵關聯
ProductCode VARCHAR(20) NOT NULL,
PriceType TINYINT NOT NULL, -- 價格策略區分
Qty INT,
Amount MONEY,
UNIQUE (OrderID, ProductCode, PriceType) -- 業務唯一性
);
| 維度 | 聯合主鍵模式 | 代理鍵模式 |
|---|---|---|
| 存儲開銷 | 高(多欄位重複) | 低(單一 4/8/16 字節) |
| JOIN 條件 | 多欄位匹配 | 單欄位整數匹配 |
| 索引大小 | 寬、深 | 窄、淺 |
| 分頁支持 | 極難 | 原生支持 |
| 業務唯一性 | 隱含在 PK | 顯式 UNIQUE 約束 |
BIGINT 配合雪花算法或 NEWSEQUENTIALID() 生成全局唯一鍵。主鍵設計應遵循「單一、無意義、窄、遞增」原則。代理鍵雖增加一列存儲,卻能換取查詢性能、開發效率與系統擴展性的全面提升。在 SQL Server 中,INT IDENTITY 仍是 90% 以上 OLTP 表的最佳選擇。