建表規(guī)約
1. 【強(qiáng)制】表達(dá)是與否概念的字段,必須使用 is _ xxx 的方式命名,數(shù)據(jù)類(lèi)型是 unsigned tinyint( 1 表示是,0 表示否 ) ,此規(guī)則同樣適用于 odps 建表。
說(shuō)明:任何字段如果為非負(fù)數(shù),必須是 unsigned 。
2. 【強(qiáng)制】表名、字段名必須使用小寫(xiě)字母或數(shù)字 ; 禁止出現(xiàn)數(shù)字開(kāi)頭,禁止兩個(gè)下劃線(xiàn)中間只出現(xiàn)數(shù)字。數(shù)據(jù)庫(kù)字段名的修改代價(jià)很大,因?yàn)闊o(wú)法進(jìn)行預(yù)發(fā)布,所以字段名稱(chēng)需要慎重考慮。
正例: getter _ admin , task _ config , level 3_ name
反例: GetterAdmin , taskConfig , level _3_ name
3. 【強(qiáng)制】表名不使用復(fù)數(shù)名詞。
說(shuō)明:表名應(yīng)該僅僅表示表里面的實(shí)體內(nèi)容,不應(yīng)該表示實(shí)體數(shù)量,對(duì)應(yīng)于 DO 類(lèi)名也是單數(shù)形式,符合表達(dá)習(xí)慣。
4. 【強(qiáng)制】禁用保留字,如 desc 、 range 、 match 、 delayed 等,請(qǐng)參考 MySQL 官方保留字。
5. 【強(qiáng)制】唯一索引名為 uk _字段名 ; 普通索引名則為 idx _字段名。
說(shuō)明: uk _ 即 unique key;idx _ 即 index 的簡(jiǎn)稱(chēng)。
6. 【強(qiáng)制】小數(shù)類(lèi)型為 decimal ,禁止使用 float 和 double 。
說(shuō)明: float 和 double 在存儲(chǔ)的時(shí)候,存在精度損失的問(wèn)題,很可能在值的比較時(shí),得到不正確的結(jié)果。如果存儲(chǔ)的數(shù)據(jù)范圍超過(guò) decimal 的范圍,建議將數(shù)據(jù)拆成整數(shù)和小數(shù)分開(kāi)存儲(chǔ)。
7. 【強(qiáng)制】如果存儲(chǔ)的字符串長(zhǎng)度幾乎相等,使用 char 定長(zhǎng)字符串類(lèi)型。
8. 【強(qiáng)制】 varchar 是可變長(zhǎng)字符串,不預(yù)先分配存儲(chǔ)空間,長(zhǎng)度不要超過(guò) 5000,如果存儲(chǔ)長(zhǎng)度大于此值,定義字段類(lèi)型為 text ,獨(dú)立出來(lái)一張表,用主鍵來(lái)對(duì)應(yīng),避免影響其它字段索引效率。
9. 【強(qiáng)制】表必備三字段: id , gmt _ create , gmt _ modified 。
說(shuō)明:其中 id 必為主鍵,類(lèi)型為 unsigned bigint 、單表時(shí)自增、步長(zhǎng)為 1。 gmt _ create ,gmt _ modified 的類(lèi)型均為 date _ time 類(lèi)型。
10. 【推薦】表的命名最好是加上“業(yè)務(wù)名稱(chēng)_表的作用”。
正例: tiger _ task / tiger _ reader / mpp _ config
11. 【推薦】庫(kù)名與應(yīng)用名稱(chēng)盡量一致。
12. 【推薦】如果修改字段含義或?qū)ψ侄伪硎镜臓顟B(tài)追加時(shí),需要及時(shí)更新字段注釋。
13. 【推薦】字段允許適當(dāng)冗余,以提高性能,但是必須考慮數(shù)據(jù)同步的情況。冗余字段應(yīng)遵循:
1 ) 不是頻繁修改的字段。
2 ) 不是 varchar 超長(zhǎng)字段,更不能是 text 字段。
正例:商品類(lèi)目名稱(chēng)使用頻率高,字段長(zhǎng)度短,名稱(chēng)基本一成不變,可在相關(guān)聯(lián)的表中冗余存儲(chǔ)類(lèi)目名稱(chēng),避免關(guān)聯(lián)查詢(xún)。
14. 【推薦】單表行數(shù)超過(guò) 500 萬(wàn)行或者單表容量超過(guò) 2 GB ,才推薦進(jìn)行分庫(kù)分表。
說(shuō)明:如果預(yù)計(jì)三年后的數(shù)據(jù)量根本達(dá)不到這個(gè)級(jí)別,請(qǐng)不要在創(chuàng)建表時(shí)就分庫(kù)分表。
15. 【參考】合適的字符存儲(chǔ)長(zhǎng)度,不但節(jié)約數(shù)據(jù)庫(kù)表空間、節(jié)約索引存儲(chǔ),更重要的是提升檢
索速度。
正例:人的年齡用 unsigned tinyint( 表示范圍 0-255,人的壽命不會(huì)超過(guò) 255 歲 ); 海龜就必須是 smallint ,但如果是太陽(yáng)的年齡,就必須是 int; 如果是所有恒星的年齡都加起來(lái),那么就必須使用 bigint 。