設計原則
- 主鍵:統一
VARCHAR(36) UUID (無序) 或 BIGINT AUTO_INCREMENT (有序,推薦雪花算法生成)。
- 字符集:全庫
utf8mb4,校對 utf8mb4_0900_ai_ci (8.0) / utf8mb4_general_ci (5.7)。
- 引擎:全表
InnoDB。
- 審計欄位:
created_at DATETIME(3) DEFAULT CURRENT_TIMESTAMP(3), updated_at DATETIME(3) DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), deleted_at DATETIME(3) NULL (軟刪除)。
- 外鍵:生產環境**建議應用層維護引用完整性**,物理外鍵僅用於核心強一致場景 (如訂單-明細),並註明
ON DELETE RESTRICT / CASCADE 語義。
完整建表腳本 (CFMS 文件管理系統示例)
-- 1. 庫
DROP DATABASE IF EXISTS cfms;
CREATE DATABASE IF NOT EXISTS cfms CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
USE cfms;
-- 2. 用戶表
DROP TABLE IF EXISTS users;
CREATE TABLE users (
id VARCHAR(36) NOT NULL COMMENT 'UUID',
username VARCHAR(50) NOT NULL COMMENT '登錄名',
password_hash VARCHAR(255) NOT NULL COMMENT 'bcrypt/argon2 哈希',
salt VARCHAR(32) COMMENT '加鹽 (如非 bcrypt)',
sex CHAR(1) COMMENT 'M/F/U',
age TINYINT UNSIGNED,
birthday DATE,
email VARCHAR(100) NOT NULL UNIQUE,
edu_background TINYINT COMMENT '1:高中 2:專科 3:本科 4:碩士 5:博士',
mobile VARCHAR(20),
tel VARCHAR(20),
reg_time BIGINT(13) NOT NULL COMMENT '毫秒級時間戳',
reg_ip VARCHAR(45) COMMENT 'IPv6 兼容',
login_count INT UNSIGNED DEFAULT 0,
last_login_at DATETIME(3),
status TINYINT DEFAULT 1 COMMENT '1:正常 0:禁用',
created_at DATETIME(3) DEFAULT CURRENT_TIMESTAMP(3),
updated_at DATETIME(3) DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
PRIMARY KEY (id),
UNIQUE KEY uk_username (username),
UNIQUE KEY uk_email (email),
INDEX idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用戶主表';
-- 3. 分類表 (名稱/類型/時間/大小) - 結構相似,展示一個
DROP TABLE IF EXISTS name_category;
CREATE TABLE name_category (
id VARCHAR(36) NOT NULL,
category_name VARCHAR(100) NOT NULL,
description TEXT,
user_id VARCHAR(36) NOT NULL COMMENT '創建者',
created_at DATETIME(3) DEFAULT CURRENT_TIMESTAMP(3),
updated_at DATETIME(3) DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
PRIMARY KEY (id),
UNIQUE KEY uk_user_name (user_id, category_name),
INDEX idx_user (user_id),
CONSTRAINT fk_nc_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='按名稱分類';
-- type_category, time_category, size_category 結構同名稱分類,略
-- 4. 文件表 (核心業務表)
DROP TABLE IF EXISTS files;
CREATE TABLE files (
id VARCHAR(36) NOT NULL,
name VARCHAR(255) NOT NULL COMMENT '存儲文件名 (UUID)',
real_name VARCHAR(255) NOT NULL COMMENT '原始文件名',
path VARCHAR(500) NOT NULL COMMENT '相對存儲路徑',
size BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '字節數',
mime_type VARCHAR(100),
md5_hash CHAR(32) COMMENT '文件指紋',
upload_time BIGINT(13) NOT NULL COMMENT '毫秒戳',
description TEXT,
keyword VARCHAR(200) COMMENT '搜索關鍵詞',
user_id VARCHAR(36) NOT NULL COMMENT '上傳者',
name_category_id VARCHAR(36),
type_category_id VARCHAR(36),
time_category_id VARCHAR(36),
size_category_id VARCHAR(36),
status TINYINT DEFAULT 1,
created_at DATETIME(3) DEFAULT CURRENT_TIMESTAMP(3),
updated_at DATETIME(3) DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
PRIMARY KEY (id),
UNIQUE KEY uk_md5_user (md5_hash, user_id) COMMENT '同用戶去重',
INDEX idx_user (user_id),
INDEX idx_upload_time (upload_time),
INDEX idx_name_cat (name_category_id),
INDEX idx_type_cat (type_category_id),
INDEX idx_time_cat (time_category_id),
INDEX idx_size_cat (size_category_id),
CONSTRAINT fk_file_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT fk_file_nc FOREIGN KEY (name_category_id) REFERENCES name_category(id) ON DELETE SET NULL ON UPDATE CASCADE,
CONSTRAINT fk_file_tc FOREIGN KEY (type_category_id) REFERENCES type_category(id) ON DELETE SET NULL ON UPDATE CASCADE,
CONSTRAINT fk_file_timec FOREIGN KEY (time_category_id) REFERENCES time_category(id) ON DELETE SET NULL ON UPDATE CASCADE,
CONSTRAINT fk_file_sc FOREIGN KEY (size_category_id) REFERENCES size_category(id) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='文件元數據';
-- 5. 擴展屬性表 (EAV 模式,應對動態屬性)
DROP TABLE IF EXISTS file_attributes;
CREATE TABLE file_attributes (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
file_id VARCHAR(36) NOT NULL,
attr_key VARCHAR(100) NOT NULL,
attr_value TEXT,
PRIMARY KEY (id),
UNIQUE KEY uk_file_key (file_id, attr_key),
INDEX idx_file (file_id),
CONSTRAINT fk_fa_file FOREIGN KEY (file_id) REFERENCES files(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='文件動態屬性';
關鍵規範說明
| 規範項 | 標準 | 理由 |
| 主鍵類型 | VARCHAR(36) UUID / BIGINT 雪花 | 分庫分表無衝突、無序寫入可預留有序主鍵 |
| 時間存儲 | BIGINT(13) 毫秒戳 / DATETIME(3) | 跨時區無歧義、精度毫秒、索引友好 |
| 軟刪除 | status/deleted_at + 唯一索引含 status | 物理刪除不可逆、軟刪除支援恢復、審計 |
| 外鍵動作 | 核心表 CASCADE,屬性表 SET NULL | 主體刪除從體級聯,分類刪除不影響文件 |
| 索引命名 | uk_唯一, idx_普通, fk_外鍵 | 一眼識別類型,便於 DBA 管理 |
| 註釋 | 每表每列必寫 COMMENT | 數據字典自動化生成、新人上手快 |
變更管理流程
- 開發提交
.sql 變更腳本 (含 UP/DOWN 回滾)。
- Code Review 檢查命名、類型、索引、外鍵、註釋。
- 測試環境
gh-ost / pt-online-schema-change 執行,驗證無鎖表。
- 生產環境滾動發布,藍綠部署兼容新舊 Schema。
此模板作為團隊《數據庫設計規範》附件,所有新項目、新表強制遵循,歷史表計劃重構對齊。
- 上一篇文章: MySQL 事務處理實戰演示:DELETE 回滾與 ACID 驗證
- 下一篇文章: macOS 下 MySQL 安裝、配置與使用全攻略 (Homebrew / DMG 雙方案)
Copyright ©
程式碼之家 All Rights Reserved