前言:數據庫設計在平時的工做是必不可少的,良好的表設計可讓咱們查詢效率更高,加快網站訪問速度,提高用戶體驗,而且方便於咱們查詢數據。本篇博客就來聚焦一下,如何設計出高可複用,優良的表結構,從而在實際的工做中使咱們寫出更好的代碼。mysql
數據庫表設計的幾條黃金準則:sql
一:字段的原子性數據庫
解釋:保證每列的原子性,不可分解,意思表達要清楚,不能含糊,高度歸納字段的含義,能用一個字段表達清楚的毫不使用第二個字段,必需要使用兩個字段表達清楚的毫不能使用一個字段緩存
二:主鍵設計數據庫設計
解釋:主鍵不要與業務邏輯有所關聯,最好是毫無心義的一串獨立不重複的數字,常見的好比UUID或者將主鍵設置爲Auto_increment;網站
三:字段使用次數設計
解釋:對於頻繁修改的字段(通常是指狀態類字段)最好用獨立的數字或者單個字母去表示,不用使用漢字或長字符的英文code
四:字段長度視頻
解釋:建表的時候,字段長度儘可能要比實際業務的字段大3-5個字段左右(考慮到合理性和伸縮性),最好是2的n次方冪值。不能建比實際業務太大的字段長度(好比訂單id若是考慮要業務增加的話,必定要使用Long型,對應的數據庫的數據類型是bigint),這是由於若是字段長度過大,在進行查詢的時候索引在B-Tree樹上遍歷會越耗費時間,從而查詢的時間會越久;可是絕對不能建小,不然mysql數據會報錯,程序會拋出異常;索引
五:關於外鍵
解釋:儘可能不要創建外鍵,保證每一個表的獨立性。若是非得保持必定的關係,最好是經過id進行關聯
六:動靜分離
解釋:最好作好靜態表和動態表的分離。這裏解釋一下靜態表和動態表的含義,靜態表:存儲着一些固定不變的資源,好比城市/地區名/國家(靜態表必定要使用緩存)。動態表:一些頻繁修改的表
七:關於code值
解釋:使用數字碼或者字母去代替實際的名字,也就是儘可能把name轉換爲code,由於name可能會變(萬一變化就會查詢處多條數據,從而拋出錯誤),可是code通常是不會變化的.另外一方面,code值存儲的字符較少,也能減小數據庫的存儲空間的壓力
八:關於Null值
解釋:儘可能不要有null值,有null值的話,數據庫在進行索引的時候查詢的時間更久,從而浪費更多的時間!能夠在建表的時候設置一個默認值!
九:關於引擎的選擇
解釋:關於引擎的選擇,innodb與myisam,myisam的實際查詢速度要比innodb快,由於它不掃面全表,可是myisam不支持事務,沒辦法保證數據的Acid。選擇哪一個這就要看本身對於效率和數據穩定性方面的實際業務的取捨了
十:資源存儲
解釋:數據庫不要存儲任何資源文件,好比照片/視頻/網站等,能夠用文件路徑/外鏈用來代替,這樣能夠在程序中經過路徑,連接等來進行索引
十一:與主鍵相關
解釋:根據數據庫設計三大範式,儘可能保證列數據和主鍵直接相關而不是間接相關
十二:關係映射
解釋:多對一或者一對多的關係,關聯一張表最好經過id去創建關係,而不是去作重複數據,這樣作最大的好處就是中間的關係表比較清楚明白。
十三:預留字段
解釋:在設計一張表的時候應該預製一個空白字段,用於之後的擴展,由於你也不是肯定這張表之後不會擴展。
十四:留下單一字段肯定是否可用
解釋:經過一個單一字段去控制表是否可用,好比一般起名爲isVaild,預製的含義爲0爲有效,1爲無效,這樣便於之後咱們去剔除數據或者重整數據,使其成爲boolean性質的數據 更加便於咱們去操控。
十五:刪除字段
解釋:數據庫是禁止使用delete命令的,通常都不會真正刪除數據,都是採用改狀態的方式,設置state字段,經過修改狀態賦予它是否有效的邏輯含義!
總結:本篇博文主要介紹了關於數據庫設計的幾條準則,如何設計出高可複用的數據庫和條例清晰的數據庫表是咱們一直要關注的話題,在實際的開發中,謹遵以上的準則,起碼保證本身的表設計出來的標準性,將會大大提高咱們的工做效率。