1. 程式人生 > >阿里MySQL資料庫建表規約

阿里MySQL資料庫建表規約

1.[強制]表達是與否概念的欄位,必須使用is_xxx的方式命名,資料型別是unsigned tinyint(0 表示否,1表示是)

說明:任何欄位如果為非負數,必須是unsigned.

正例:表達邏輯刪除的欄位名is_deleted,0表示未刪除,1表示刪除.

2.[強制]表名,欄位名必須使用小寫字母或數字,禁止出現數字開頭,禁止兩個下劃線中間只出現數字.資料庫欄位名的修改代價很大,因為無法進行預釋出,所以欄位名稱需要慎重考慮.

說明:MySQL在Windows下不區分大小寫,但在Linux下預設是區分大小寫.因此,資料庫名,表名,欄位名,都不允許出現任何大寫字母,避免節外生枝.

正例:aliyun_admin,rdc_config,level3_name

反例:AliyunAdmin,rdcConfig,level_3_name

3.[強制]表名不使用複數名詞.

說明:表名應該僅僅表示表裡面的實體內容,不應該表示實體數量,對應於DO類名也是單數形式,符合表達習慣.

4.[強制]禁用保留字,如desc,range,match,delayed等,請參考MySQL官方保留字.

5.[強制]主鍵索引名為pk_欄位名,唯一索引名為uk_欄位名,普通索引名是idx_欄位名.

說明:pk_即primary key,uk_ 即unique key,idx_ 即index的簡稱.

6.[強制]小數型別為decimal,禁止使用float和double.

說明:float和double在儲存的時候,存在精度損失的問題,很可能在值的比較時,得到不正確的結果,如果儲存的資料範圍為decimal的範圍,建議將資料拆成整數和小數分開儲存.

7.[強制]如果儲存的字串長度幾乎相等,使用char定長字串型別.

8.[強制]varchar是可變長字串,不預先分配儲存空間,長度不要超過5000,如果儲存長度大於此值,定義欄位型別為text,獨立出來一張表,用主鍵來對應,避免影響其他欄位索引效率.

9.[強制]表必備三欄位:id,gmt_create,gmt_modified.

說明:其中id必為主鍵,型別為unsigned bigint,單表時自增,步長為1.gmt_create,gmt_modified的型別均為date_time型別,前者現在時表示主動建立,後者過去分詞表示被動更新.

10.[推薦]表的命名最好是加上"業務名稱_表的作用".

正例:alipay_task/force_project/trade_config

11.[推薦]庫名和應用名稱儘量一致.

12.[推薦]如果修改欄位含義或對欄位表示的狀態追加時,需要及時更新欄位註釋.

13.[推薦]欄位允許適當冗餘,以提高查詢效能,但必須考慮資料一致,冗餘欄位應遵循:1)不是頻繁修改的欄位.2)不是varchar超長欄位,更不能是text欄位.

正例:商品類目名稱使用頻率高,欄位長度短,名稱基本一成不變,可在相關聯的表中冗餘儲存類目名稱,避免關聯查詢.

14.[推薦]單錶行數超過500萬行或者單表容量超過2GB,才推薦進行分庫分表.

說明:如果預計三年後的資料量根本達不到這個級別,請不要在建立表時就分庫分表.

15.[參考]合適的字元儲存長度,不但節約資料庫表空間,節約索引儲存,更重要的是提升檢索速度.

正例:如下表,其中無符號值可以避免誤存負數,且擴大了表示範圍.