訂單是整個電子商務的核心。整個電子商務的流程也是圍繞訂單的狀態執行的。這篇博客主要向大家介紹訂單號的生成方式。
現在大型電商網站大多都有好幾種下單途徑。比如:通過Web網站下單,通過打電話到呼叫中心下單(CallCenter),使用手機Wap下單。如果只采用單數據庫來存儲訂單信息的話,其隨著訂單量的增加,單數據庫寫壓力必然增大,數據庫服務器就會不堪重負,所以大都會根據業務采用分庫做法。如下:
Web網站來源訂單調用生成訂單API後,存儲在Web訂單庫。CallCenter網站調用生成訂單API後,存儲在CallCente訂單庫。Wap來源訂單調用訂單生成API後,存儲在Wap訂單庫。最後需要把Web訂單庫,CallCenter訂單庫,Wap訂單庫等數據同步到後台訂單主庫中。後台訂單主庫是我們的核心庫,存儲所有訂單數據。那麼我們怎麼才能把不同庫中的訂單數據同步到後台主庫中,需要滿足什麼條件呢?電商網站中訂單表大多都是以訂單號做表的主鍵,我們必須保證各個子訂單庫中存儲的訂單號不能重復。這樣才能保證可以安全的同步到後台主庫中。
目前幾個大型電子商務網站是如何生成訂單號的呢。讓我們先看看訂單號的格式吧。京東商城訂單號格式:157444499;蘇寧易購訂單號格式:2000839647;凡客誠品訂單號格式:213052230059。
我們先來分析一下凡客誠品訂單號生成規則。初看一下,凡客誠品訂單號含有130522,這是因為這張訂單是2013年5月22號下的訂單。我們總結一下,凡客的訂單規則:業務編碼+年的後2位+月+日+訂單數。其實現方式應該是在數據庫中新建一張訂單量記錄表維護每天的訂單量。生成訂單時,根據當天的日期查詢這張表的訂單數量加1,然後組合業務編碼(比如業務編碼Web=1,CallCenter=2,Wap=3)即為訂單號。生成訂單成功後在回寫數據庫(需記錄訂單量)。這種方式在高並發下會頻繁更新訂單量記錄表,很容易產生鎖表。而且這種方式競爭對手可以通過訂單號分析你每天的訂單數量。
京東商城和蘇寧易購的訂單號看不出規則。我們猜想應該是 有一個全局數據庫,這個數據庫中只有一張訂單表(Order),表Order只有一個自增的字段Id,這個自增的字段Id就是訂單號。所有生成訂單的API會首先訪問全局數據庫的Order表獲得訂單號,然後再生成訂單。這樣就可以保證子庫訂單號不重復。其實現方式避免了頻繁的更新操作,只有Insert操作,性能要好很多。
淘寶的訂單號共有15位,其中後4位數字是用戶Id的後4位,其他11位都是隨機的。
訂單號的主要作用是保證在系統中的唯一編號。個人認為生成訂單號不應太復雜,過於復雜就會影響性能。不能讓競爭對手從訂單號分析你的訂單量,這是為了商業秘密。
感謝閱讀,希望這篇文章能給你帶來幫助!