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

MySQL 數據庫 Schema 標準化模板:庫、表、字符集、主外鍵、UUID 主鍵規範

     編輯:MySQL 綜合教學

設計原則

  • 主鍵:統一 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='文件動態屬性';

關鍵規範說明

變更管理流程

  1. 開發提交 .sql 變更腳本 (含 UP/DOWN 回滾)。
  2. Code Review 檢查命名、類型、索引、外鍵、註釋。
  3. 測試環境 gh-ost / pt-online-schema-change 執行,驗證無鎖表。
  4. 生產環境滾動發布,藍綠部署兼容新舊 Schema。

此模板作為團隊《數據庫設計規範》附件,所有新項目、新表強制遵循,歷史表計劃重構對齊。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
規範項標準理由
主鍵類型VARCHAR(36) UUID / BIGINT 雪花分庫分表無衝突、無序寫入可預留有序主鍵
時間存儲BIGINT(13) 毫秒戳 / DATETIME(3)跨時區無歧義、精度毫秒、索引友好
軟刪除status/deleted_at + 唯一索引含 status物理刪除不可逆、軟刪除支援恢復、審計
外鍵動作核心表 CASCADE,屬性表 SET NULL主體刪除從體級聯,分類刪除不影響文件
索引命名uk_唯一, idx_普通, fk_外鍵一眼識別類型,便於 DBA 管理
註釋每表每列必寫 COMMENT數據字典自動化生成、新人上手快