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

MySQL 資料庫命名與設計規範:從 3NF 到工程落地的完整標準

     編輯:MySQL 綜合教學

MySQL 資料庫命名與設計規範:從 3NF 到工程落地的完整標準

統一的命名規範、設計原則與文檔標準是團隊協作、系統可維護性的基石。本文涵蓋設計原則、字符規範、庫/表/欄位命名、類型選擇、文檔模板、索引原則、SQL 規範與工程技巧。

一、設計原則

1. 標準化與規範化 (3NF)

  • 核心原則:「One Fact in One Place」—— 事實只在一處存儲
  • 表僅包含實體固有屬性,關聯通過外鍵連接
  • 例:Customer、Order 兩表,Order 僅存 customer_id 指向 Customer
  • 效率優先時可適度反範式化(冗餘字段減少 JOIN),但須文檔記錄

2. 數據驅動

  • 策略、配置、流程數據化存儲,避免硬編碼
  • 例:外部數據源連接信息、工作流定義、角色權限矩陣均入庫
  • 將維護權限下放給業務用戶,減少代碼發布

3. 考慮變化

  • 預留歷史追蹤欄位:start_date、end_date、version
  • 例:姓名變更(婚姻改姓)需保留歷史記錄

二、字符規範

  • 允許字符:26 英文字母(區分大小寫)、0-9、下劃線 _,共 63 個
  • 禁止:中文、特殊符號、空格、保留字
  • 長度限制:對象名 ≤ 30 字符,變量名 ≤ 29 字符(不含 @)

三、資料庫命名規範

類型格式範例
正式庫{biz}_{env} 小寫+下劃線web_19floor_net, web_car
備份庫{正式庫}_{YYYYMMDD}web_19floor_net_20240115

四、資料表命名規範

類型格式範例
業務表{biz_prefix}_{entity} 前綴 ≤ 5 字符web_user, web_group, supe_userspace
備份表{正式表}_{YYYYMMDD}web_user_20240115
關聯表{entity1}_{entity2}user_role, order_item
臨時表tmp_{biz}_{purpose}tmp_order_export_202401

五、欄位命名規範

  • 格式:lowerCamelCase,建議帶表前綴
  • 範例:web_user 表 → userId, userName, userPassword
  • 關聯欄位跨表同名:web_user.userId ↔ web_group.userId
  • 布爾型建議 is_/has_/can_ 前綴:isDeleted, hasPermission
  • 時間戳:createdAt (INT, Unix 秒)、gmtCreated (DATETIME)
  • 枚舉值:status (TINYINT) + 字典表/註釋說明

六、欄位類型選擇原則

原則錯誤示例正確示例
用最小足夠類型INT 存狀態值(0-3)TINYINT UNSIGNED
定長優於變長VARCHAR(255) 存 MD5CHAR(32) 或 BINARY(16)
精確類型FLOAT 存金額DECIMAL(19,4) 或 BIGINT 存分
時間類型VARCHAR 存日期DATETIME / TIMESTAMP / INT(Unix秒)
大文本TEXT 存 200 字描述VARCHAR(500) (能用 VARCHAR 別用 TEXT)

七、資料庫設計文檔模板

—————————————————————————
表名: web_user
作者: ZhangSan
日期: 2024-01-15
版本: 1.0
描述: 存儲用戶基礎資料
具體內容:
userId        BIGINT UNSIGNED  AUTO_INCREMENT  PRIMARY KEY  用戶唯一標識
userName      VARCHAR(32)      NOT NULL        UNIQUE       用戶名
userPassword  CHAR(60)         NOT NULL                    bcrypt 哈希
email         VARCHAR(128)     NOT NULL        UNIQUE       郵箱
phone         VARCHAR(20)      NULL                        手機號
status        TINYINT UNSIGNED NOT NULL        DEFAULT 1    1=正常 2=禁用 3=鎖定
createdAt     INT UNSIGNED     NOT NULL                    創建時間戳
gmtCreated    DATETIME         NOT NULL                    創建時間
updatedAt     INT UNSIGNED     NOT NULL                    更新時間戳
gmtModified   DATETIME         NOT NULL                    更新時間
version       INT UNSIGNED     NOT NULL        DEFAULT 1    樂觀鎖版本號
—————————————————————————

八、索引使用原則

  1. 邏輯主鍵用唯一組合索引,系統鍵(存儲過程用)用唯一非組合索引,外鍵列建非組合索引
  2. **必須索引外鍵**—— 關聯查詢高頻使用
  3. **禁止索引** BLOB/TEXT、大字段(前綴索引除外)
  4. **小表不建索引**—— 全表掃描比維護索引更快(頻繁增刪時尤甚)
  5. 單表索引數 ≤ 5 個(非核心表 ≤ 3),定期清理未用索引 pt-index-usage

九、SQL 編寫規範

  • 關鍵字**全大寫**:SELECT, FROM, WHERE, ORDER BY, GROUP BY, JOIN
  • 表名、庫名、欄位名用**反引號包裹**:\`table\`, \`column\`
  • 字符串用**單引號**:'value'
  • 範例:SELECT COUNT(*) FROM \`web_user\` WHERE \`userName\` = 'zhangsan';
  • 複雜查詢使用 CTE (WITH) 替代嵌套子查詢
  • 禁止 SELECT *,禁止 INSERT 不指定欄位名

十、工程落地技巧

  1. 避免觸發器: 改用應用層事件/消息隊列,調試困難、隱式邏輯
  2. 用英文而非拼音縮寫: user_name 而非 un,下拉選單按英文排序
  3. 保存元數據: 專表存 db_version, last_check, doc_link, owner
  4. 版本機制: 表結構變更記錄 schema_version 表,支援回滾
  5. 文檔化一切: 註釋、命名規範、限制、函數,工具支援 (DataGrip/PDMan/DBDoc)
  6. 測試三部曲: 單元測試 → 集成測試 → 用戶驗收測試 (UAT),上線前必做
  7. 原型驗證設計: 針對每個展示頁/報表,驗證數據模型能否支撐查詢
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved