DB開發規範---初稿

1 公共約定

1.1 存儲引擎

默認統一使用InnoDB引擎mysql

1.2 字符集設定

後續新建DB默認使用utf8mb4字符集,校對規則使用utf8mb4_general_binsql

歷史DB多使用utf8字符集,此部分不作改動。函數

1.3 隔離級別

統一使用read-committed隔離級別(RDS默認)。大數據

不採用mysql默認的read-repeated隔離級別。設計

1.4 應用訪問帳號

應用訪問帳號由開發和DBA共同協商決定,默認一個DB提供兩個帳戶,命名規則爲xxxx_rw和xxxx_ro。索引

xxxx爲區分區分業務模塊的縮寫,長度控制在10個字符之內。事務

xxxx_rw爲業務讀寫帳戶,默認權限爲insert,update,select。不支持delete權限,delete操做統一使用邏輯刪除或者走數據修改流程由DBA完成。ci

xxxx_ro爲業務只讀帳戶,默認權限爲select。開發

應用訪問帳號爲配置在應用裏的專屬帳號,任何我的不得使用。字符串

2 表設計

2.1 表命名

一、 全部表名不區分大小寫,統一使用小寫命名。

2 、命名規則必須見名知意,命名與業務、產品線等相關聯。

三、表名長度控制在40個字符之內。

四、 禁止使用mysql關鍵字,包括且不限於的關鍵字有:key、values、repeat、use、show、schema、desc。

5 、臨時表必須以tmp爲前綴,例如 tmp_test01。

2.2 表設計

一、禁止使用外鍵,觸發器。

二、表必需要有註釋,全部字段必需要有註釋。

三、儘可能將字段設計成not null的,並維護好not null約束。

四、設計表時要預估一年的數據增量,若一年數據量上千萬(單月數據上幾百萬),須要考慮數據是否能夠分區、是否能夠歸檔處理以及歸檔策略。

2.3 字段設計

一、 全部表必須有三個標準字段

id char(24) 主鍵。

create_time datetime 建立時間,只能在insert時插入now(),不容許自定義數據插入。

update_time datetime 更新時間,只能在insert或update是更新爲now(),不容許自定義數據插入,代碼作任何update操做時必須同步更新update_time字段,維護單列索引。

is_deleted tinyint(1)  是否刪除

2 、存儲小數所有使用decimal,不容許出現float、double。

三、存儲時間,所有使用datetime,再也不使用timestamp,默認存儲到秒。若須要存儲到毫秒級別,須要使用datetime(6),毫秒最多保留6位精度,能夠根據須要自定義精度,如datetime(3)。

四、對於vachar(10),長度定義指的是字符長度,一個漢字或者一個字母都是一個字符,儘可能準確估算須要的長度

五、不容許使用text、blob等字段。

六、不容許使用bit字段,使用tinyint代替。

七、不容許使用enum、set字段。

 

2.4 索引設計

一、索引命名建議採用包含索引類型、表名、字段名三要素。表名和字段名能夠酌情縮寫,整個名稱長度建議不超過32位。對於普通索引,統一使用idx_前綴,惟一索引使用uk_前綴。

二、insert時同步維護create_time和update_time,update時維護update_time。update_time字段必須創建一個索引。

三、儘可能創建組合索引,理解mysql組合索引的最左使用原則,好比(a,b,c) 至關於 (a) 、(a,b) 、(a,b,c)。

四、創建組合索引的時候,區分度高的放在前面,查詢使用場景多的放在前面。

五、惟一索引的全部字段必須設置爲not null。

六、單表索引儘可能不超過5個,單個索引中的字段數不超過5個。

七、若建索引不知道如何合適,請與DBA溝通。

2.5 SQL語句

一、禁止使用select * ,全部查詢必須明確字段名稱。

二、禁止使用子查詢,使用join方式代替。

三、禁止使用左%匹配查詢,例如: like "%abc",沒法利用到索引。

四、禁止隱式轉換,數值類型禁止加引號;字符串類型必須加引號。

五、禁止大事務,禁止單條sql進行大量數據更新,會形成從庫延遲。單次更新超過10W的更新,須要採用過程分批更新,批次更新單批次不超過500條,批次間sleep很多於0.5s。

六、insert時必須將create_time和update_time填充爲now()

七、update時必須更新update_time字段爲now()。

八、大數據量查詢必需要使用limit進行分頁處理,單次查詢控制在1000條之內。

九、儘可能使用union all 代替 union

十、表關聯最多不能超過3個,且關聯條件必須有匹配的索引。

十一、分區表查詢必需要帶分區鍵。

十二、禁止where中對字段進行函數或表達式處理。如where year(update_time) = '2018'。

1三、禁止無where條件的查詢,如where 1=1

1四、禁止使用標量子查詢。

1五、禁止查詢中使用!=、not in。

相關文章
相關標籤/搜索