1. 先做一下專業術語解釋:spu和sku
這里拿iphone6s舉例,它身上有很多的屬性和值, 比如:
- 毛重: 420.00 g
- 產地: 中國大陸
- 容量: 16G, 64G, 128G
- 顏色: 銀, 白, 玫瑰金
spu 指的是商品(iphone6s),spu屬性就是不會影響到庫存和價格的屬性, 又叫關鍵屬性,與商品是一對一的關系,比如:
- 毛重: 420.00 g
- 產地: 中國大陸
sku指的是具體規格單品(玫瑰金 16G),sku屬性就是會影響到庫存和價格的屬性, 又叫銷售屬性,與商品是多對一的關系,比如:
- 容量: 16G, 64G, 128G
- 顏色: 銀, 白, 玫瑰金
所以iphone6s則會生成 3 * 3 = 9 個 sku
上面這張圖是我項目中用到的商品相關的幾張數據表, 請只關注有數據值的字段,其它為業務需要,一共包含如下5張表
1. 商品分類表 mmall_category
此表采用無限層級樹狀數據結構,程序使用遞歸算法來遍歷分類下的所有子分類,parent_id是父級分類, parent_id=0時說明是根節點, 屬於一級類別; 如使用遞歸查詢出100034包含100037子類別,依次類推,這樣就構成一個可以無限擴展的數字結構;
- 商品分類表--mmall_category
- 商品表--------mmall_product
- 商品規格表--mmall_product_specs
- 屬性key表---mmall_attribute_key
- 屬性value表-mmall_attribute_value
2. 商品表 mmall_product(也稱spu表)
spu表中關鍵字段是category_id和attribute_list兩個字段:
category_id 記錄這個商品屬於哪個分類, 用於通過分類進行商品搜索;
attribute_list 記錄的是所有屬性集合,這個字段采用json格式存儲,便於前端解析;前端解析后可以在頁面顯示出商品的所有屬性, 用戶點擊選擇出屬性組合后,前端可以拼接成{"內存":"2G","顏色":"紅色","尺寸":"20cm"}這樣的json格式加上商品id在(商品規格表 mmall_product_specs)查詢到具體的單品,隨即獲取到具體單品的庫存和價格等信息;
3. 商品規格表 mmall_product_specs(也稱sku表)
sku表保存的是具體的單品信息,比如具體規格的庫存和價格等,核心字段是product_id和product_specs,product_id 記錄的是spu表中的商品id,product_specs 記錄的是該單品具體的屬性值(規格值);
4. (屬性key表 mmall_attribute_key)和(屬性value表-mmall_attribute_value)
屬性key表和屬性value表僅用於管理后台頁面生成屬性選項,管理員在發布新商品時勾選屬性,方便規格的錄入和保證正確性;
這里我使用了兩張橫表spu表和sku表實現不同商品的存儲,spu表使用attribute_list字段保存屬性集合,查詢時使用product_id和product_specs去sku表中獲取的具體的單品信息, spu表中可以增加一些商品的公共信息字段,例如名稱、發布的商家、發布日期、上架狀態, sku表中增加一些每個單品不同的字段,比如不同的單品有不同圖片和名稱或者詳情說明等等,反正根據業務進行擴展
總結, 上述數據表設計方案適用於商品類別差異不是很大的情形,通過表的字段可以發現不同的商品之間變化的信息只有 attribute_list字段, 而這個字段通過json來存儲各種不同的屬性集合, 同樣sku表中變化的字段只有 product_specs 也是通過json來存儲各種不同屬性組合。