本文整理自阿里巴巴內部數據庫設計規範,結合領域建模(DDD)思想,從業務邊界劃分、範式遵循、索引策略、命名約定、演進兼容等維度,構建企業級關係型數據庫設計標準。
| # | 規則 | 說明 |
|---|---|---|
| 1 | 必須有主鍵 | 推薦無符號 BIGINT 自增 |
| 2 | 一字段一含義 | 拒絕過載語義,如 status 同時表示啟用/刪除/審核 |
| 3 | 雙時間戳標配 | gmt_create、gmt_modified 均為 DATETIME,無業務邏輯 |
| 4 | MySQL 用 DATETIME | 不使用 TIMESTAMP(2038 年問題、時區依賴) |
| 5 | 禁用複雜類型 | 數組、JSON、自定義類型 → 拆表或序列化存文本 |
| 6 | 附屬表主鍵同主表 | 垂直拆分時,附屬表 id = 主表 id,不另加主鍵 |
| 7 | 過期數據必歸檔 | 設計初期規劃過期機制,定時遷移至歷史表(如 _his 後綴) |
| 8 | 廢棄表重命名歸檔 | RENAME TO tbl_deprecated_yyyyMMdd,禁止直接 DROP |
| 9 | 廢棄字段禁刪除 | 保留字段,標註 _deprecated,兼容歷史數據與回滾 |
| 10 | 統一 THIN 驅動 | 禁止 OCI Thick 驅動,避免客戶端安裝依賴 |
ALTER TABLE t ENGINE=InnoDB(鎖表久)或 CREATE ... LIKE + ALTER ENGINE + INSERT SELECT(無鎖遷移)| 場景 | 推薦類型 | 避坑指南 |
|---|---|---|
| 可空字段 | 盡量 NOT NULL + 默認值 | NULL 導致索引統計複雜、額外存儲字節 |
| 時間戳 | DATETIME (8B) / TIMESTAMP (4B) | TIMESTAMP 範圍 1970~2038,跨時區業務慎用 |
| 精確金額 | DECIMAL(19,4) | Float/Double 浮點誤差不可接受 |
| 枚舉狀態 | TINYINT + 應用層 Enum | ENUM 修改需 DDL,擴展困難 |
| IP 地址 | INT UNSIGNED | 用 INET_ATON()/INET_NTOA() 轉換,節省空間利於範圍查詢 |
-- 表達式基準測試
SELECT BENCHMARK(10000, SHA1('test'));
-- 慢查詢日志
SET GLOBAL slow_query_log=1;
SET GLOBAL long_query_time=1; -- 秒
-- 執行計劃
EXPLAIN SELECT * FROM t WHERE col=1;
CREATE TABLE `task_new` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主鍵', `task_name` VARCHAR(128) NOT NULL COMMENT '任務名稱', `gmt_create` DATETIME NOT NULL COMMENT '創建時間', `gmt_modified` DATETIME NOT NULL COMMENT '修改時間', `start_time` DATETIME NOT NULL COMMENT '開始時間', `end_time` DATETIME NOT NULL COMMENT '結束時間', `enable` TINYINT NOT NULL DEFAULT 1 COMMENT '是否可用', PRIMARY KEY (`id`), KEY `idx_name_channel` (`task_name`, `channel`), KEY `idx_activity` (`activity`(255)) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='任務表';
規範不是束縛,而是團隊協作的共同語言。嚴守 10 條鐵律,配合領域建模指導業務邊界,讓數據庫結構既能支撐高併發,又能優雅演進。