選自“瀟灑哥和黑大帥”公眾號他炊,一個程序員和他的愛情故事争剿。
不使用enum
首先說一下優(yōu)點,可以控制插入字符的選項痊末,規(guī)范數(shù)據(jù)蚕苇。那說說有哪些缺點,如下:
- 不方便擴(kuò)展:后期如果增加選項凿叠,如果不是插入到最后涩笤,那 enum 的索引就會調(diào)整
- 保存要注意:如果存儲數(shù)字字符串時,一定要帶引號盒件,如果不帶蹬碧,會視為索引
總結(jié):如果你的內(nèi)容是固定的,后期不會增加炒刁,那可以選擇 enum 恩沽,例如:男、女翔始。那如果是狀態(tài)類的飒筑,后期會根據(jù)業(yè)務(wù)增加新狀態(tài),那就使用 tinyint(1) 绽昏。
不使用外鍵
這是一個把約束最終交給數(shù)據(jù)庫還是程序的問題协屡,我在這說說我的幾點看法。
- 性能:沒有了外鍵約束全谤,那自然性能會提高肤晓。
- 可讀性:有外鍵約束,增加 ER 圖的可讀性,方便查看表之間的關(guān)系补憾。
- 完整性:有外鍵約束漫萄,可以在數(shù)據(jù)庫層面控制數(shù)據(jù)的完整性,不會造成一個表有數(shù)據(jù)盈匾,一個表沒有腾务。但如果我進(jìn)行數(shù)據(jù)的部分保全,那使用外鍵就是個約束削饵。
說了這幾點后岩瘦, 自然也明白了我不選擇使用外鍵的原因。
不存儲NULL值
當(dāng)保存字符串?dāng)?shù)據(jù)是空的時候窿撬,往往有兩種選擇启昧,空字符串或NULL。那如何選擇呢劈伴,我這里先給出建議密末,選擇空字符串(默認(rèn)空字符串),原因如下:
- 空值不占空間跛璧,NULL值占空間严里。當(dāng)字段不為NULL時,也可以插入空值追城。
- 當(dāng)使用 IS NOT NULL 或者 IS NULL 時田炭,只能查出字段中沒有不為NULL的或者為 NULL 的,不能查出空值漓柑。
- 在進(jìn)行count()統(tǒng)計某列的記錄數(shù)的時候教硫,如果采用的NULL值,系統(tǒng)會自動忽略掉辆布,但是空值是會進(jìn)行統(tǒng)計到其中的瞬矩。
TIMESTAMP和DATETIME
-
存儲方式
對于TIMESTAMP,它把客戶端插入的時間從當(dāng)前時區(qū)轉(zhuǎn)化為UTC(世界標(biāo)準(zhǔn)時間)進(jìn)行存儲锋玲。查詢時,將其又轉(zhuǎn)化為客戶端當(dāng)前時區(qū)進(jìn)行返回惭蹂。
而對于DATETIME,不做任何改變盾碗,基本上是原樣輸入和輸出。
范圍
- DATETIME 時間截至到 9999-12-31 23:59:59
- TIMESTAMP 時間截止到 2038-1-19 11:14:07
- 自動填充時間
mysql5.6 之前 TIMESTAMP 支持如下語法廷雅,5.6之后 DATETIME 才支持
-- 創(chuàng)建時自動填充當(dāng)前時間
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
-- 創(chuàng)建和修改時自動填充當(dāng)前時間
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
- 總結(jié)
如果不考慮時間的截至日期耗美,我考慮選擇 TIMESTAMP京髓,因為可以兼容不同版本的時間填充和時區(qū)控制商架。
字符集和排序規(guī)則
在創(chuàng)建數(shù)據(jù)庫時,需要設(shè)定字符集和排序規(guī)則蛇摸。
先說字符集备图,推薦使用 utf8mb4 ,這個包含目前所有的信息存儲赶袄,例如:emoji表情揽涮、所有語言
-
排序規(guī)則
- utf8_general_ci 不區(qū)分大小寫弃鸦,這個你在注冊用戶名和郵箱的時候就要使用幢痘。
- utf8_general_cs 區(qū)分大小寫唬格,如果用戶名和郵箱用這個 就會照成不良后果
- utf8_bin:字符串每個字符串用二進(jìn)制數(shù)據(jù)編譯存儲颜说。 區(qū)分大小寫,而且可以存二進(jìn)制的內(nèi)容
注意:一般選擇 utf8_general_ci 喊积,它在where 語句進(jìn)行比對查詢時,速度很快乾吻。
不使用bit類型
在設(shè)計表時拟蜻,如果出現(xiàn)狀態(tài)之類的字段。例如:0 代表男酝锅,1 代表女。使用 tinyint(1) 代替爸舒。原因如下:
-
不能節(jié)省空間大小
剛開始我從字面意思理解 bit(1) 只占用了 1 bit(位)(1字節(jié)等于8bit)稿蹲,那真實情況是什么,查看官網(wǎng)文檔后發(fā)現(xiàn)苛聘,bit(M) 的存儲空間大約是 (M+7)/8 字節(jié)嫉入,也就是說 bit(1) 存儲的大小不是 1位璧尸,而是1 字節(jié)
-
使用上的不便
mysql中的二進(jìn)制類型,存儲數(shù)據(jù)時使用 B'1111100' 或 b'1111100' 爷光,讀取數(shù)據(jù)時使用 bin(column_name)。
少用text類型
查詢速度: char > varchar > text
- 存儲的數(shù)據(jù)長度固定欢瞪,選擇char類型
- 不固定的話使用varchar徐裸,避免使用text,如果varchar長度不夠時可以增加長度重贺。在業(yè)務(wù)方面內(nèi)容長度最好得到規(guī)范和控制。
以上是我在實際開發(fā)中所總結(jié)的一些經(jīng)驗次企,如果你還有其它說的潜圃,請在評論區(qū)補(bǔ)充。