系統單據號生成規則推薦

劉軼發表於2018-12-31

對訂單類系統而言,單據號是非常重要的東西。一個好的單據號組成往往應該包含豐富的元素,利於問題的調查,業務的擴充套件。

這裡列舉幾種不好的單據號範例:

  • 單純的數字遞增: 001, 002, 003 //無業務含義
  • UUID//無業務含義,且無順序概念
  • 日期+使用者ID//當天同一使用者發生兩筆業務時可能重複

好的單據號規則

系統標識 日期 sequence空間
表示當前單據號是屬於哪個系統的,比如001表示支付系統,002表示團購系統 表示這筆單據是發生在哪一天的,yyyyMMdd格式字串 可放8位數字,支援一億的sequence,值可以來自當前表的主鍵ID,不滿8位的左邊統一補0,這個保證了最終的唯一性

如果當前系統有子單據概念,比如訂單系統裡還有物流單的概念,則可以加入子業務單標識

系統標識 日期 子業務單標識 sequence空間
- - 001表示物流單,002表示退款單 -

如果你的資料庫是分庫分表的,則強烈建議在單據號中加入分庫分表位,將有很大的收益

系統標識 日期 分庫分表位 sequence空間
- - 0102表示01庫的02號表 -

總之好的單據號可以獲得如下收益:

  • 根據單據號馬上可以知道這個來自哪個系統,發生在哪一天
  • 在這個系統中屬於具體哪一個子業務
  • 這筆單子是屬於哪個庫哪個表的
  • 在程式中只要你能獲得單據號,就能通過擷取的方式獲得很多有價值的資訊,便於邏輯的處理。久而久之你會不自主讓單據號貫穿整個系統,也樂意在日誌中列印,將極大方便你解決問題
  • 當整個系統群都遵守統一的標準時,你會發現當進入任意一個新系統時,只要給你這個系統的單據號則你都能快速定位日誌,程式碼,資料庫表,非常利於學習

讓我們擁抱好的單據號生成習慣吧!

相關文章