基於電商中臺架構-商品系統設計(一)

銀河1號發表於2018-11-15

一、總體設計

為什麼採用中臺架構前幾篇已經說明了,這裡就介紹一下基礎層和平臺層的功能。

基於電商中臺架構-商品系統設計(一)基於電商中臺架構-商品系統設計(一)

1. 基礎層

釋出、編輯、上架、下架這些功能大家應該比較熟悉。

稽核:是否需要稽核通過才允許上架

打標:對商品進行標記,例如參加某種活動

Sku管理:商品和sku關係

關聯關係:前後端商品關聯關係、組合商品關聯關係等

前後端商品:前端商品面向使用者,後端商品面向倉庫

類目:商品類目,前後端類目

屬性:商品屬性、類目屬性等等

2. 平臺層

商品管理:商品的基本操作

商品收藏:管理使用者收藏的商品

商品快照:儲存商品編輯的每一個快照版本

活動打標:根據不同的活動對映到商品屬性上不同標記

銷量管理:商品的銷量統計、以及排序操作

瀏覽歷史:使用者瀏覽記錄

搜尋:不同維度對商品的搜尋

二、概念定義

1. Item-sku

Item代表產品 sku代表商品

舉例:item對應蘋果7手機 但蘋果7有黑色、白色 則sku對應黑色的蘋果7手機

對應關係如下:

基於電商中臺架構-商品系統設計(一)基於電商中臺架構-商品系統設計(一)

2. 前後端商品

前端商品:面向使用者的,在商城展示銷售的,它是一個虛擬的概念。

後端商品:面向倉庫實體商品的,比如一臺電腦就建立一個後端商品。它和倉庫有著緊密的關係,同步庫存,入庫出庫等操作都要同步到該商品資訊。

前端商品和後端商品有個對映關係,比如前端商品為電腦,則後端商品會對應一個電腦。

後端組合商品:有些商品是可以單個售賣,也可以打包售賣,比如電腦套裝優惠,這個套裝就是一個組合商品A,他是由電腦B、滑鼠C、鍵盤D組成。

所以這裡就有一個對映關係A->(1B,1C,1D)。此時如果需要在商城售賣,則可以建立一個前端商品和A進行關聯。

3. 關聯關係

這裡關聯關係就包括:前端商品和後端商品的對映關係、後端組合商品和單個商品的關係。根據這個關係可以確定該商品在哪些倉庫有庫存、該發貨幾個等等。

4. 商品快照

商品每次編輯都會儲存一份快照,一來可以記錄操作日誌,二來可以追溯,比如訂單會存一個快照商品版本,根據該版本找到下單當時的商品資訊。

5. 商品打標

打標其實就是一個標記,比如一個商品參加的十幾個活動,那麼怎麼在商品上儲存,我們可以使用一個long型欄位flag來儲存,long是64位,每一位代表一種型別的活動,0代表否,1代表是,通過對flag進行二進位制操作即可完成活動資訊更新。

6. 類目

類目也分為前後端類目,前端類目就是面向使用者,具有導航功能,而且易變。

後端類目是和商品直接關聯,很穩定。前後端類目有對映關係。

7. 屬性

商品關聯的屬性,舉例:黑色蘋果7手機,他具有屬性為顏色,屬性值為黑色。

三、技術設計

1. 關係圖

基於電商中臺架構-商品系統設計(一)基於電商中臺架構-商品系統設計(一)


2. 商品關鍵欄位介紹

商品表都是基於分庫分表的設計。

category_id:商品和類目是一對一的關係,建立商品的時候需要首先獲取到商品所屬類目。判斷該類目下商品釋出是否需要稽核,以及商品必須要填充該類目下關聯的屬性並儲存到商品上。

item_pattern:商品形態:包括實物商品、虛擬商品、服務商品,為什麼要有這個欄位,因為實物商品需要關聯倉庫實物商品;虛擬商品不需要關聯,比如電子書、視訊等等;服務商品作為另外一種特殊處理方式,比如三年保修、送貨上門等都是作為一種服務,我們把它抽象成服務商品,在下單時一同加入訂單中,這樣做的好處在於易於擴充套件。

item_type:商品型別:包括前端商品和後端商品;或者組合商品,或者擴充套件的商品型別。

shop_id:歸屬的店鋪

selle_id+item_code:商家id和商家編碼,如果是商家自己erp系統匯入的商品,則這兩個欄位是唯一的,能唯一確定商家系統的商品。

flag:標記位,進行二進位制打標操作。

biz_type:所屬業務平臺,根據該欄位進行不同業務間的資料隔離。

feature:擴充套件欄位,將商品屬性存在裡面,也可儲存未來新加的資訊而無需改表結構。

3. 商品歷史表Item_history設計

歷史表就是已經刪除了的商品資料表,那為什麼要把刪除的資料儲存下來,這就是電商系統的設計原則,任何表的資料只邏輯刪除,不進行物理刪除。所以很多表都會加上is_delete欄位標記是否被刪除。

基於電商中臺架構-商品系統設計(一)基於電商中臺架構-商品系統設計(一)


但是商品表為什麼要新建一張表,這裡有兩點,1)商品表中有唯一鍵約束,(seller_id,item_code),如果刪除了放在原表,商家再次同步該商品時,因為這兩個欄位相同,會影響唯一鍵約束,但又不能真正刪除,所以就將資料移至歷史表。2)商品表資料日積月累會越來越龐大,將刪除的資料遷出有利於提高原表的效能。

4. 商品快照設計

商品作為電商交易中的物件,對其任何的改動都至關重要,所以儲存快照一方面是把每次的更改記錄都儲存下來。另一方面是存在類似於交易訂單的場景,需要當時商品的資訊,以便處理投訴、維權。

那麼快照資料更加龐大,因為每一次的改動都會生成一份資料,所以不能存在資料庫,而是採用外部儲存。查詢的時候需要itemId+snapshotVersion,商品id和快照版本進行查詢。

基於電商中臺架構-商品系統設計(一)基於電商中臺架構-商品系統設計(一)


5. 商品打標設計

首先定義一個活動型別列舉類,說明每一位代表什麼活動。其他型別也可以,反正就是標記該商品具有某種屬性。

基於電商中臺架構-商品系統設計(一)基於電商中臺架構-商品系統設計(一)


假如flag=0;現在商品參加某個活動,flag第三位代表該活動,則打標過程為;

flag=flag | (1 << 2)
複製程式碼
去標同樣的邏輯。

6. 商品擴充套件欄位設計

不僅是商品表,在工作中我們會經常遇到,在需求不斷迭代的過程中,肯定會有新增欄位的需求,但如果我們新增的欄位都不是關鍵欄位的話(不用於檢索),比如商品表如果後端商品現在需要儲存長寬高、質量、以及一些產地等資訊,我們就可以通過擴充套件欄位的方式解決,而且還免去了對線上表加列的操作。擴充套件欄位feature其實就是Json格式的字串,預留一定長度,待後面有需求在往裡面加鍵值對。

比如說加之前是這樣存的:

{“length”:10,“width”:12,”height”:20}複製程式碼

加了產地後就變為

{“length”:10,“width”:12,”height”:20,”region”:”HZ”}
複製程式碼

但更新的時候一定注意要帶版本更新,否則併發情況將會發生資料覆蓋。這也是另外一個設計原則,資料庫所有表都要加version欄位的原因:資料更新樂觀鎖控制。

7. 商品銷量統計&排序

銷量其實不是作為商品本身的一個屬性,因為銷量是根據交易訂單成交量來動態計算出來的,但是一般電商網站都會有根據銷量排序的需求,那這個怎麼實現呢。肯定是搜尋引擎來做,因為搜尋條件太多,排序條件太多,資料庫索引也支援不了各種組合查詢、排序。所以我們就根據業務需求,一般銷量一天統計一次就滿足需求了。在商品索引中新增一個銷量欄位,每天定時任務從訂單裡面統計銷量,然後再以訊息的方式,推送到搜尋引擎,搜尋排序的時候搜尋引擎就能幫我們實現這個功能。

8. 商品類目設計

類目設計將在後續文章詳細介紹。包括前臺類目、後臺類目、類目樹構建、類目快取設計、類目屬性等等。

9. 商品搜尋設計

搜尋設計將在後續文章詳細介紹。搜尋設計包括搜尋引擎選型、儲存結構設計、索引構建、搜尋、以及通用搜尋框架等等。

四、總結

本文介紹了商品系統分層設計,以及每一層對應的功能和功能設計。後續還會對商品系統中設計要點、細節進行詳細介紹,比如類目、搜尋。此外,在實現中還涉及了許多中介軟體的封裝使用,所以後續還會對通用元件(通用搜尋框架、訊息框架)進行介紹。

更多文章歡迎訪問 http://www.apexyun.com/

公眾號:銀河系1號

聯絡郵箱:public@space-explore.com

(未經同意,請勿轉載)


相關文章