常用數據庫設計規范
一、 基本原則
物理數據模型是在邏輯模型的基礎上,結合所使用的數據庫的性能以及技術實現上的一些特殊要求,如索引、壓縮、分表等機制,以最小容量的數據存儲和最快的讀寫響應,綜上要素進行設計。
1. 在基於邏輯模型的三范式基礎上,可以基於實際情況進行部分逆范式化設計以更好的滿足數據查詢的性能以及其他技術要求。
2. 使用主鍵實現實體的完整性,主鍵盡量采用系統生成的值(數據庫自增,分布式系統發號器等方式),避免手工操作導致的數據庫錯誤,因此在設計每張實體表時,一定要設定該表主鍵的生成規則。
3. 對於所有的非參數、非代碼類實體表,增加相應的技術字段(創建時間create_time,創建用戶create_user,變更時間update_time,變更用戶update_user),用以記錄數據操作的記錄,以便於數據審計。
二、 命名規范:
1、實體(表)命名規范:
(1)【建議】表的命名要貼合該表的業務含義和用途,盡量采用英文翻譯詞匯,或者已有的標准詞根;
(2)【強制】庫名、表名、字段名采用26個英文字母和0-9這十個數字,加上下划線'_'組成('_'不能為首字符);
(3)【強制】庫名、表名、字段名禁止超過32個字符;
(4)【強制】不得使用數據庫的關鍵詞或保留字作為表名稱;
(5)【強制】表名統一采用下划線分段命名法,即:單詞或短語間用下划線‘_’進行分割,表名禁止使用中文;
統一格式為“前綴(類型分類)”+“表名英文翻譯”+“_后綴”(表用途分類)。
(6)【強制】前綴規范:
a. 一般業務表必須以 ‘t_’ 作為前綴. 如 t_user;
b. 臨時庫、表名必須以tmp_為前綴,並以日期為后綴. 如tmp_table_20180718;
c. 備份庫、表必須以bak_為前綴,並以日期為后綴。如bak_tablename_20180718;
d. 視圖的前綴為 view_;
e. 索引的前綴,一般索引以 idx_ 開頭;唯一索引以 uk_ 開頭;主鍵索引以 pk_ 開頭。
(7)【建議】后綴規范:
a. 代碼表采用后綴 “_cd” 命名;
b. 日志表采用后綴 “_log”命名;
c. 參數表采用后綴 “_prmt”命名;
d. 關系表采用后綴 “_rela”命名;
e. 歷史表采用后綴 “_his” 命名。
2、屬性(字段)命名規范:
(1) 不使用各類數據庫的關鍵詞和保留字作為字段名稱;
(2)屬性字段的命名要符合該字段的業務含義,建議使用統一的標准詞根進行命名;
(3)字段命名統一采用下划線分段命名法。
三、 MySQL強制性規范:
1、為了保障數據庫長期運行的穩定以及使用效率的提升,以下是使用MySQL數據庫需遵循的開發規范:
(1)使用字母、數字和下划線組成,一律小寫,名稱禁止只使用MySQL保留關鍵字(如user,status,date,data,type等)。不遵循該規范可能存在的問題:運維時命令行連接MySQL對其他特殊字符和保留關鍵字使用時需要做特殊處理,對自動化運維和批處理增加復雜度;
(2)禁用procedure、function、trigger、views、event、外鍵約束。不遵循該規范可能存在的問題:列舉的功能會消耗數據庫資源,降低數據庫實例可擴展性,推薦都在程序端實現;
(3)非必要,不需要指定庫、表、字段字符集,指定庫、表和字段的字符集時需要檢查是否和集團、公司、團隊和系統默認字符集有慢查詢的風險;
(4)創建表時存儲引擎類型需為InnoDB。原因:它遵循ACID模式設計,對事物和行鎖支持好,讀寫頻繁業務支持並發性支持較好;
(5)新建表必須有主鍵,主鍵類型必須為int或bigint且自增。Innodb是一種索引組織表:數據的存儲邏輯順序按主鍵排序的。非自增主鍵會導致innodb內部page分裂和大量隨機I/O;
(6)單個表最多只可以存在一個大字段。原因:MySQL是行存儲模式數據庫,即使查詢只涉及到其中一個或者少量字段,MySQL也會把整行數據都讀取到內存里進行過濾處理;
(7)單個表字段總設置行長度不能超過8k。原因:MySQL最小I/O單位是page,當行越長,一個page能存放的行越少,當范圍查詢涉及的I/O變高,行長過大更容易造成行遷移,產生碎片;
(8)字段不能使用enum,set類型,應該使用TINYINT來代替。原因:如果使用enum,set類型,業務新增值時需要對表進行ddl操作,增加維護性,若沒提前加會導致數據插入失敗,影響業務;
(9)單個表的索引個數不能超過7個。原因:當表做insert、delete、update時需要對索引進行維護,過多索引會增加維護成本,降低修改insert、update、delete速度;
(10)所有字段定義為NOT NULL,如需default 空,建議使用default ''。如果null字段建立索引,需要額外的1字節,使索引,索引統計,值的比較變得更復雜;
(11)表和列必須有comment注釋,便於開發和后期維護。