Java開發程式碼規範之MySQL資料庫(一)——建表規約
文章通過學習《阿里巴巴Java開發手冊》整理
1。表達是否概念的欄位,必須使用is_xxx的方式命名,資料型別是unsigned tinyint(1表示是,0表示否)
說明:任何欄位如果為非負數,必須是unsigned。
例子:表達邏輯刪除的欄位名is_deleted,1表示刪除,0表示未刪除
2。表名、欄位名必須使用小寫字母或數字,禁止出現數字開頭,禁止兩個下劃線中間只出現數字。
MySQL在windows下不區分大小寫,但在Linux下預設區分大小寫。so,資料庫名、表名、欄位名都不允許出現任何大寫字母,避免節外生枝。
3。表名不使用複數名詞。
表名應該僅僅表示表裡面的實體內容,不應該表示實體數量。對於DO類名也是單數形式,符合表達習慣。
4。禁用保留字。
如desc、range、match、delayed等。
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。表的命名最好加上“業務名稱_表的作用”
eg: alipay_task / force_project
11.庫名與應用名稱儘量一致。
12。如果修改欄位含義或對欄位表示的狀態追加時,需要及時更新欄位註釋。
13。欄位允許適當冗餘,以提高查詢效能,但必須考慮資料一致,冗餘欄位應遵循:
不是頻繁修改的欄位;
不是varchar超長欄位,更不能是text欄位
14。單錶行數超過500萬行或者單表容量超過2GB,才推薦進行分庫分表。
說明:如果預計三年後的數量根本達不到這個級別,請不要在建立表時就分庫分表。
15。合適的字元儲存長度,不但節約資料庫表空間,節約索引儲存,更重要的是提升檢索速度。
物件 | 年齡區間 | 型別 | 位元組 | 表示範圍 |
---|---|---|---|---|
人 | 150歲之內 | unsigned tinyint | 1 | 無符號值:0-255 |
龜 | 數百歲 | unsigned smallint | 2 | 無符號值:0-65535 |
恐龍化石 | 數千萬年 | unsigned int | 4 | 無符號值:0-約42.9億 |
太陽 | 約50億年 | unsigned bigint | 8 | 無符號值:0-約10^19 |