MYSQL建表規約


【強制】表達是與否概念的字段,必須使用 is_xxx 的方式命名,數據類型是 unsigned tinyint( 1 表示是,0 表示否),此規則同樣適用於 odps 建表。


說明:任何字段如果為非負數,必須是 unsigned。


舉例:`is_star` tinyint unsigned DEFAULT NULL COMMENT '項目狀態(1 表示是,0 表示否)',




【強制】表名、字段名必須使用小寫字母或數字;禁止出現數字開頭,禁止兩個下劃線中間隻出現數字。數據庫字段名的修改代價很大,因為無法進行預發佈,所以字段名稱需要慎重考慮。


正例:getter_admin,task_config,level3_name


反例:GetterAdmin,taskConfig,level_3_name




【強制】表名不使用復數名詞。


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




【強制】禁用保留字,如 desc、range、match、delayed 等,參考官方保留字。




【強制】唯一索引名為 uk_字段名;普通索引名則為 idx_字段名。


說明:uk_ 即 unique key;idx_ 即 index 的簡稱。




【強制】小數類型為 decimal,禁止使用 float 和 double。


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




【強制】如果存儲的字符串長度幾乎相等,使用 CHAR 定長字符串類型。




【強制】varchar 是可變長字符串,不預先分配存儲空間,長度不要超過 5000,如果存儲長度大於此值,定義字段類型為 TEXT,獨立出來一張表,用主鍵來對應,避免影響其它字段索引效率。




【強制】表必備三字段:id, gmt_create, gmt_modified。


說明:其中 id 必為主鍵,類型為 unsigned bigint、單表時自增、步長為 1; 分表時改為從TDDL Sequence 取值,確保分表之間的全局唯一。gmt_create, gmt_modified 的類型均為date_time 類型。




【推薦】表的命名最好是加上“業務名稱_表的作用”,避免上雲梯後,再與其它業務表關聯時有混淆。


正例:tiger_task / tiger_reader / mpp_config




【推薦】庫名與應用名稱盡量一致。




【推薦】如果修改字段含義或對字段表示的狀態追加時,需要及時更新字段註釋。




【推薦】字段允許適當冗餘,以提高性能,但是必須考慮數據同步的情況。冗餘字段應遵循:


1)不是頻繁修改的字段。


2)不是 varchar 超長字段,更不能是 text 字段。


正例:各業務線經常冗餘存儲商品名稱,避免查詢時需要調用 IC 服務獲取。




【推薦】單表行數超過 500 萬行或者單表容量超過 2GB,才推薦進行分庫分表。


說明:如果預計三年後的數據量根本達不到這個級別,請不要在創建表時就分庫分表。


反例:某業務三年總數據量才 2 萬行,卻分成 1024 張表,問:你為什麼這麼設計?答:分 1024張表,不是標配嗎?




【參考】合適的字符存儲長度,不但節約數據庫表空間、節約索引存儲,更重要的是提升檢索速度。


正例:人的年齡用 unsigned tinyint(表示范圍 0-255,人的壽命不會超過 255 歲);海龜就必須是 smallint,但如果是太陽的年齡,就必須是 int;如果是所有恒星的年齡都加起來,那麼就必須使用 bigint。

0 個評論

要回覆文章請先登錄註冊