1. 程式人生 > >資料庫表設計的幾條準則

資料庫表設計的幾條準則

前言:資料庫設計在平時的工作是必不可少的,良好的表設計可以讓我們查詢效率更高,加快網站訪問速度,提升使用者體驗,並且方便於我們查詢資料。本篇部落格就來聚焦一下,如何設計出高可複用,優良的表結構,從而在實際的工作中使我們寫出更好的程式碼。

資料庫表設計的幾條黃金準則:

一:欄位的原子性

解釋:保證每列的原子性,不可分解,意思表達要清楚,不能含糊,高度概括欄位的含義,能用一個欄位表達清楚的絕不使用第二個欄位,必須要使用兩個欄位表達清楚的絕不能使用一個欄位

二:主鍵設計

解釋:主鍵不要與業務邏輯有所關聯,最好是毫無意義的一串獨立不重複的數字,常見的比如UUID或者將主鍵設定為Auto_increment;

三:欄位使用次數

解釋:對於頻繁修改的欄位(一般是指狀態類欄位)最好用獨立的數字或者單個字母去表示,不用使用漢字或長字元的英文

四:欄位長度

解釋:建表的時候,欄位長度儘量要比實際業務的欄位大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欄位,通過修改狀態賦予它是否有效的邏輯含義!

總結:本篇博文主要介紹了關於資料庫設計的幾條準則,如何設計出高可複用的資料庫和條例清晰的資料庫表是我們一直要關注的話題,在實際的開發中,謹遵以上的準則,起碼保證自己的表設計出來的標準性,將會大大提升我們的工作效率。