對訂單類系統而言,單據號是非常重要的東西。一個好的單據號組成往往應該包含豐富的元素,利於問題的調查,業務的擴充套件。
這裡列舉幾種不好的單據號範例:
- 單純的數字遞增: 001, 002, 003 //無業務含義
- UUID//無業務含義,且無順序概念
- 日期+使用者ID//當天同一使用者發生兩筆業務時可能重複
好的單據號規則
系統標識 | 日期 | sequence空間 |
---|---|---|
表示當前單據號是屬於哪個系統的,比如001表示支付系統,002表示團購系統 | 表示這筆單據是發生在哪一天的,yyyyMMdd格式字串 | 可放8位數字,支援一億的sequence,值可以來自當前表的主鍵ID,不滿8位的左邊統一補0,這個保證了最終的唯一性 |
如果當前系統有子單據概念,比如訂單系統裡還有物流單的概念,則可以加入子業務單標識
系統標識 | 日期 | 子業務單標識 | sequence空間 |
---|---|---|---|
- | - | 001表示物流單,002表示退款單 | - |
如果你的資料庫是分庫分表的,則強烈建議在單據號中加入分庫分表位,將有很大的收益
系統標識 | 日期 | 分庫分表位 | sequence空間 |
---|---|---|---|
- | - | 0102表示01庫的02號表 | - |
總之好的單據號可以獲得如下收益:
- 根據單據號馬上可以知道這個來自哪個系統,發生在哪一天
- 在這個系統中屬於具體哪一個子業務
- 這筆單子是屬於哪個庫哪個表的
- 在程式中只要你能獲得單據號,就能通過擷取的方式獲得很多有價值的資訊,便於邏輯的處理。久而久之你會不自主讓單據號貫穿整個系統,也樂意在日誌中列印,將極大方便你解決問題
- 當整個系統群都遵守統一的標準時,你會發現當進入任意一個新系統時,只要給你這個系統的單據號則你都能快速定位日誌,程式碼,資料庫表,非常利於學習
讓我們擁抱好的單據號生成習慣吧!