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

MySQL 資料庫設計與開發規範全文:命名、建模、SQL、架構治理標準化指南

     編輯:MySQL 綜合教學

MySQL 資料庫設計與開發規範全文:命名、建模、SQL、架構治理標準化指南

本規範旨在統一團隊資料庫設計開發標準,避免因規範缺失導致的維護災難,培養良好習慣保障軟體品質。適用於所有涉及資料庫設計開發的技術人員。

術語定義

  • 規則(強規範): 必須強制遵守
  • 建議: 必須審慎考慮
  • 說明/示例: 輔助理解與正反例

一、書寫規範

SQL 書寫(12 條規則 + 2 條建議)

  • 關鍵字大寫,其餘小寫(SELECT col FROM tbl;)
  • 4 空格縮進,禁用 Tab
  • 多行 SQL 關鍵字左對齊,非關鍵字分行對齊上一行同類代碼最左側
  • 禁用 SELECT *(COUNT(*) 除外),明確列出欄位
  • INSERT 必須指定欄位清單
  • 同表同記錄多欄位讀寫合併單一 SQL
  • 逗號後加空格、運算符兩側加空格、混合運算符加括號明確優先級
  • 單行不超 120 字符、謂詞處必須換行
  • 建議:INSERT/UPDATE 單行一欄位、欄位相對縮進 4 格、註釋左對齊
  • 建議:INSERT...SELECT 字段順序對應、每行 ≤ 4 欄位、括號另起行

預存程序書寫(3 條規則 + 3 條建議)

  • 禁同行多語句、獨立程式塊間空行、多表必用有意義別名
  • 變數類型長度與表欄位嚴格匹配、程式碼塊必加註釋
  • 建議:IF/ELSE 判斷順序優化、避免嵌套 IF 改多條件、變數命名規範(v_區域、p_輸入、x_輸出、cur_游標)

二、物件命名規範(通用 5 條規則 + 分類細則)

  • 禁中文、長度限制(庫/表/欄 ≤ 30、用戶 ≤ 16)、**全小寫 + 下劃線**、禁拼音/縮寫、禁保留字
  • 表: 同業務同前綴、時間分表後綴 _YYYY[MM[DD]]
  • 欄位: 有含義+註釋、同用途跨表類型長度命名一致、建議公共欄位標準名(create_user/time、update_user/time、remark、聯絡資訊等)
  • 主鍵: 分庫分表用有序 UUID CHAR(32)、單表用自增 UNSIGNED INT/BIGINT、統一名 id
  • 外鍵: fk_表名、同引用欄位類型命名一致
  • 索引: 唯一 uk_表名_欄位、普通 idx_表名_欄位、全文 fullidx_表名_欄位
  • 視圖: v_表名[_表名...] 或 v_功能描述
  • 函數: func_功能、預存程序 proc_功能、觸發器 trig_表名_ins/del/upd_before/after
  • 臨時表: tmp_功能、上線重命名表 原表名_YYYYMMDD
  • 庫/用戶: retail_模組名(如 retail_pos/retail_mdm),用戶名與庫名一致

三、物件設計規範

表設計(8 條規則 + 2 條建議)

  • 設計文檔必含:資料保留時間、最大保留量、讀寫頻率
  • 關聯表同功能欄位同名同類型、每表必有主鍵
  • 字元集統一 UTF8,校對 utf8_bin(大小寫敏感)
  • 引擎統一 InnoDB、必加表註釋
  • 建議:同步數倉表標註頻率機制、歷史表後綴 _hist

欄位設計(7 條規則 + 2 條建議)

  • 必加註釋,枚舉值必在註釋說明含義
  • 定長用 CHAR、不定長用 VARCHAR
  • 日期:僅年月日用 DATE、含時分秒用 DATETIME/TIMESTAMP(注意範圍與時區差異)
  • Oracle NUMBER 轉換:N=0→整型、N>0→DECIMAL(MySQL 超範圍截斷不報錯)
  • 固定長度字串用 CHAR、單字符 CHAR(1)
  • 禁 NULL,用預設值替代(時間用 '0000-00-00 00:00:00'、備註用空串)
  • 禁 ENUM/SET 改 TINYINT、慎用 BLOB/TEXT(大欄位拆表關聯)、建議 UNSIGNED 存非負數

索引設計(4 條規則 + 9 條建議)

  • 單表索引 ≤ 5、單欄索引 ≤ 2、組合索引欄位 ≤ 3、外鍵欄位必建索引
  • 建議:高頻 WHERE 欄位、關聯欄位、高選擇性(>0.6)、平衡讀寫、查詢量 <10% 用索引、WHERE 條件匹配組合索引前導欄、高選擇性欄位前置、頻繁查詢欄位前置、GROUP BY/ORDER BY 欄位前置

視圖/預存程序/函數/觸發器(核心規則)

  • 視圖禁 ORDER BY、多表關聯必指定別名、基礎數據源自表不嵌套視圖
  • 預存程序/函數:避免業務邏輯下沉、**必加異常捕獲**、禁 GOTO、循環更新必批量提交+事務控制、游標必關閉、異常必回滾、註釋格式規範(COMMENT說明+##變更記錄)
  • 觸發器:非必要禁用、必經 DBA 審批、完整性靠應用事務不靠觸發器、高一致性依賴用 BEFORE

四、開發規範

基本鐵律(10 條規則)

  • 禁用預存程序/觸發器/函數(MySQL 存在 Bug 且易耦合)
  • 禁隱式類型轉換(導致索引失效),時間類型在 myBatis 傳時間型或字串轉標準格式
  • 禁非索引欄位關聯、禁 LIKE '%...' 開頭模糊查詢
  • FOR UPDATE 嚴控條件避免鎖表、無必要禁用
  • UNION ALL 替代 UNION(無去重需求)、減少去重
  • 避免 != 等非等值操作、WHERE 條件欄位上禁用函數轉換(轉換參數值)
  • 禁 ORDER BY RAND()(全表掃描排序)、避免大 SQL 拆小 SQL

綁定變數規範(3 條規則)

  • 所有 WHERE 條件變數必用綁定變數(防注入+效能)
  • myBatis:#{var} 綁定、${var} 替換;動態 ORDER BY 必須枚舉白名單禁外部輸入
  • IN 子句用 <foreach> 迭代陣列實現綁定,禁字串拼接

分頁規範

  • 禁 LIMIT 大偏移量, 小行數
  • 推薦:WHERE create_time < last_time ORDER BY create_time DESC LIMIT N 或 INNER JOIN (SELECT id ... LIMIT offset, rows) USING(id)

效能建議(10 條)

  • 用 IF 聚合減少掃描、避免 HAVING 改 WHERE 前置過濾
  • 少用 NOT EXISTS/IN(擇 NOT EXISTS)、少用 IS NULL
  • IN 值 ≤ 300、大表避免 CAST/CONVERT、盡量避免全表掃描
  • SELECT 建議 LIMIT 1000、適度冗余簡化 SQL、自增 ID 取 LAST_INSERT_ID()

五、開發實用技術速查

字元集長度單位

CHAR(N)/VARCHAR(N) 中 N 為**字符數**非位元組。UTF8 下漢字 3 位元組、字母數字 1 位元組。VARCHAR(44) 可存 44 字符(含混合)。

日期函數

  • 當前:NOW()(秒)、CURDATE()(天)、CURTIME()(秒)
  • 加減:DATE_ADD(date, INTERVAL expr type)、DATE_SUB(...),type 含 YEAR/MONTH/DAY/HOUR/MINUTE
  • 差值:DATEDIFF(expr1, expr2) 返回天數差
  • 擷取:YEAR()/MONTH()/DAY()/WEEKDAY()

類型轉換

  • 字串轉日期:DATE_FORMAT()/STR_TO_DATE(),格式 %Y-%m-%d %H:%i:%s
  • 通用:CAST(expr AS type)、CONVERT(expr, type)、CONVERT(expr USING charset)

InnoDB vs MyISAM 核心差異

維度MyISAMInnoDB
檔案結構.frm/.MYD/.MYI 三檔表空間 + 日誌檔,受限於 OS 檔案大小
事務不支援支援 ACID、外鍵
鎖粒度表鎖(讀寫互斥,寫優先,可配 low_priority_updates/concurrent_insert)**行鎖**(針對索引,非索引查詢退化為表鎖),MVCC 非鎖定讀
COUNT(*)直接讀儲存行數極快全表掃描計算(無 WHERE 時)
大量 SELECT優良
大量 INSERT/UPDATE差優
DELETE FROM tbl重建表極快逐行刪除較慢
LOAD TABLE FROM MASTER支援不支援(需轉 MyISAM 導入再轉回)
總結: 規範非束縛,而是**團隊協作的放大器**。嚴守命名與設計規範,謹慎用好開發鐵律,善用實用技術,**讓資料庫結構清晰、SQL 高效、維護無憂**。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved