Like Share Discussion Bookmark Smile

J.J. Huang   2020-05-13   Java   瀏覽次數:

《阿里Java開發手冊》 | MySQL 資料庫 - 建表規約

【強制】表達是與否概念的欄位,必須使用 is_xxx 的方式命名,資料類型是 unsigned tinyint (1 表示是,0 表示否)。
說明:任何欄位如果為非負數,必須是 unsigned。
注意:POJO類中的任何布林類型的變數,都不要加 is 前綴,所以,需要在 設置從 is_xxx 到 Xxx 的映射關係。資料庫表示是與否的值,使用 tinyint 類型,堅持 is_xxx 的命名方式是為了明確其取捨含義與取值範圍。
正例:表達邏輯刪除的欄位名 is_deleted,1 表示刪除,0 表示未刪除。


【強制】表名、欄位名必須使用小寫字母或數字,禁止出現數字開頭,禁止兩個底線中間只出現數字。資料庫欄位名的修改代價很大,因為無法進行預發布,所以欄位名稱需要慎重考慮。
說明:MySQL 在 Windows 下不區分大小寫,但在 Linux 下預設是區分大小寫。因此,資料庫名、表名、欄位名,都不予許出現出現任何大寫字母,避免節外生枝。
正例:aliyun_admin,rdc_config,level3_name
反例:AliyunAdmin,rdcConfig,level_3_name


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


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


【強制】主鍵索引名為 pk_欄位名;唯一索引名為 uk_欄位名;普通索引名則為idx_欄位名。
說明:pk_ 即 primary key;uk_ 即 unique key;idx_ 即 index 的簡稱。


【強制】小數類型為 decimal,禁止使用 float 和 double。
說明:在存儲的時候,float 和 double 都存在精度損失的問題,很可能在比較值的時候,得到不正確的結果。如果存儲的資料范圍超過 decimal 的範圍,建議將資料拆成整數和小數並分開存儲。


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


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


【強制】表必備三欄位:id, gmt_create, gmt_modified。
說明:其中 id 必為主鍵 ,類型為 bigint unsigned 、單表時自增、步長為 1。 gmt_create, gmt_modified 的類型均為 datetime 類型,前者現在時表示主動式建立,後者過去分詞表示被動式更新。


【推薦】表的命名最好是遵循“業務名稱_表的作用”。
正例:alipay_task / force_project / trade_config


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


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


【推薦】欄位允許適當冗餘,以提高查詢性能,但必須考慮資料一致。冗餘欄位應遵循:

  • 不是頻繁修改的欄位。
  • 不是唯一索引的欄位。
  • 不是 varchar 超長欄位,更不能是 text 欄位。

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


【推薦】單表行數超過 500 萬行或者單表容量超過 2GB,才推薦進行分庫分表。
說明:如果預計三年後的資料量根本達不到這個級別,請不要在建立表時就分庫分錶。


【參考】合適的字符存儲長度,不但節約資料庫表空間、節約索引存儲,更重要的是提升檢索速度。
正例:無符號值可以避免誤存負數,且擴大了表示範圍。

對象 年齡區間 類型 字節 表示範圍
150 歲之內 tinyint unsigned 1 無符號值:0 到 255
數百歲 smallint unsigned 2 無符號值:0 到 65535
恐龍化石 數千萬年 int unsigned 4 無符號值:0 到約 43 億
太陽 約 50 億年 bigint unsigned 8 無符號值:0 到約 10 的 19 次方

心得

看完這篇「建表規約」後,要知道一套系統在初期準備的時候,業務邏輯確認後,開始設計最先出來的基本上會是Table Schema;在建立每個表的時候,要考慮到表名、欄位名、資料類型⋯等等,這些都是需要特別注意根據需求去做設定;針對文章提到的幾點特別提出來,表名不要複數(以前專案公司看過表名全部帶s表示複數); is_xxx 的映射,這個比較特別,is這個在映射 POJO 的時候,要特別注意。

基本上其他的都有照著這須規則在做規劃,一個好的專案會因為資料庫開表、欄位名而影響到整個的品質。

結語

文章越看越多,技術越學越多,就會發現自己的不足;技術學到後面都會想要將基礎再重新在打得更加扎實。

以前在開發覺得理所當然的事情,例如:命名規則、命名規範,照著別人怎麼說就怎麼做的想法,並沒有好好去想為什麼要這樣設計和規範。
於是乎同事們推薦《阿里巴巴Java開發手冊》來做閱讀,書中提到種種規範《正確範例》、《錯誤範例》還有解釋定義說明;我相信在閱讀完這一系列後,一定會更加扎實且實在。

如對此書有興趣,建議去購買官方認證的書籍,給予官方支持。

註:如有侵權,通知即刪。


註:以上參考了
Alibaba-Java-Coding-Guidelines Github
Alibaba-Java-Coding-Guidelines English Version