基礎規範
【建議】使用InnoDB儲存引擎
【強制】無特殊要求必須使用UTF8字符集
【強制】資料表、資料欄位必須加入中文註釋
【強制】禁止使用儲存過程、檢視、觸發器、Event。特殊情況申請評審
【強制】不在資料庫做運算,cpu計算務必移至業務層
命名規範
【建議】 命名使用具有實際意義的英文詞彙、詞彙縮寫,詞彙之間使用下劃線分隔;
【強制】 命名只能使用小寫英文字母、數字、下劃線,且必須英文字母開頭,下劃線為分割符,不能超過32個字元,資料庫物件名儘可能簡短。避免使用MySQL的保留字
【強制】普通表名命名規則為功能模組字首_+tablename(login_users); 臨時表:tmp字首+tablename+8位時間字尾(tmp_users_20170501); 備份表:bak字首+tablename+8位時間字尾(bak_users_20170501); 歸檔表命名規則:arch字首+tablename+歸檔規則 (arch _users_2013)【強制】各表之間相同意義的欄位必須同名,資料型別、長度、單位必須相同。
【強制】索引以idx_開頭唯一索引以uq_idx開頭,後面跟索引所在欄位名,多單片語成的列名,取儘可能代表意義的縮寫,如t_user_contacts表member_id和friend_id上的組合索引:idx _mid_fid,,組合索引命名應注意欄位順序。如在欄位member_id和欄位user_id上建立組合索引,則可以命名為idx _uid_mid(userid, member_id)
常用約定:
【建議】序號列欄位:以id為字尾,如:user_id表示使用者編號
【建議】編碼欄位:以code為字尾,如:cust_code表示客戶編碼
【建議】布林值欄位:以“is_”字首+欄位描述+形容詞。如member表上表示為enabled的會員的列命名為is_member_enabled。0:否;1:是
【強制】狀態欄位:以“_status”為字尾,前面加業務邏輯名。如:使用者狀態可命名為user_status,訂單狀態為order_status 以此類推
表設計規範(***)
【強制】表設計必須有表主鍵,並且主鍵不能提供給外部系統,給外部系統的必須使用業務主鍵,如user表的業務主鍵設計,如下id 表主鍵,自增,表主鍵不能像外部系統提供 xxx_id 為業務主鍵,使用IdGenerater(id生成工具類生成,見附件),可以提供給外部系統,使用bigint儲存
【強制】表必須有主鍵,如果使用auto_increment作為自增主鍵,注意匯出初始化指令碼時不要設定起始值。
【強制】列舉型別使用tinyint型別
【強制】單表欄位數不要太多,最多不要大於50個,且儘可能的少用字元型資料型別
【強制】日期的資料(不包含時分秒的),使用int(11)儲存(如,yyyy、yyyyMM、yyyyMMdd),時間的資料((包含時分秒的)),使用datetime儲存。
【強制】每個表都必須包含兩個保留欄位:create_time(建立時間),update_time(最後修改時間)creater varchar(50)(建立人),updater varchar(50)(修改人),設定為非空欄位屬性。這兩個欄位不包含額外的業務邏輯。
【強制】每個表設定is_del(0為未刪除,1為刪除)標記位欄位,設定為非空,預設為0的欄位屬性,生產環境不允許物理刪除。特殊表再議
【強制】表和列定義的時候必須加上comment,並能精確描述表和列的含義。型別、狀態等欄位必須明確給出各個值代表的含義;金錢等計量欄位必須給出精確的計量單位;外來鍵欄位必須明確給出關聯的表和欄位
【強制】若需要JOIN的欄位(連線鍵),欄位名稱、資料型別、長度和單位必須保持絕對一致,避免隱式轉換
【強制】禁止使用TEXT、BLOB型別(大文字、大檔案、大照片存放在檔案系統),可以把檔案放到檔案伺服器中,資料庫只存url
【強制】不推薦使用enum,set。因為它們浪費空間,且列舉值寫死了,變更不方便。推薦使用tinyint或smallint
【強制】如果有業務流轉的加欄位:業務流水號
【強制】如果一次操作多張表需要檢視修改或者回退操作的,加操作流水號
【強制】禁止建立外來鍵約束,外來鍵約束由應用程式控制。外來鍵會導致表與表之間耦合,update與delete操作都會涉及相關聯的表,影響sql 的效能,甚至會造成死鎖。
【強制】排序欄位都不允許為空,並設定預設值。
欄位設計規範
【強制】字串型別一律使用VARCHAR型別,對於明確長度的建議使用char,如身份證號等
【強制】禁止使用TEXT、BLOB型別。會浪費更多的磁碟和記憶體空間,非必要的大量的大欄位查詢會淘汰掉熱資料,導致記憶體命中率急劇降低,影響資料庫效能
【建議】欄位定義為NOT NULL並且提供預設值。null的列使索引/索引統計/值比較都更加複雜,對MySQL來說更難最佳化;需要更多的儲存空;只能採用is null或is not null,而不能採用=、in、='2017-02-15'-- 正確的寫法是: SELECT uid FROM t_user WHERE day>= xxxfunc ('2017-02-15 00:00:00')
【強制】禁止使用OR條件。使用IN或者UINON代替
【強制】禁止大表使用JOIN查詢,禁止大表使用子查詢。極大影響資料庫效能
【強制】禁止負向查詢,以及%開頭的模糊查詢。a)負向查詢條件:NOT、!=、、!、NOT IN、NOT LIKE等,會導致全表掃描 b)%開頭的模糊查詢,會導致全表掃描
【強制】使用IN不能超過200
【建議】UNION ALL 代替 UNION操作。
【建議】order by的順序儘量與索引保持一致
【強制】大批次更新凌晨操作,避開高峰