電商通用型商品中心設計

作者:京東物流 高峯

1 需求

構建一個電商通用型商品中心,可支持商品的種類和屬性繁多,可以售賣實物、虛擬、會員、服務類商品。每一種商品具有不同的規格,不同的規格的商品有多種價格,商品可支持多種貨幣的支付。

1)目的是什麼?

帶大家一起實現一個通用型商品中心,從中學到一些擴展性設計思想。

2)你能學到什麼?

  • 理解行業術語和概念
  • 動態sku表單設計
  • 屬性和sku擴展性設計
  • 價格擴展性設計
  • 商品規格設計

3)不能學到什麼?

  • 商品圖片存儲設計
  • 商品上下架設計
  • 商品標籤設計
  • 庫存設計
  • 搜索篩選設計

2 商品的基本概念

商品中心是電商各個系統的最基礎單元,爲商城、訂單,優惠促銷、庫存、倉儲物流等系統提供基礎數據。

電商的基本術語。

  1. SKU:(Stock Keeping Uint,即庫存量單位),庫存控制的最小可用單位。例如“iPhone 7 Plus 128G銀色”就是一個SKU,倉庫管理、採購進貨、庫存管理都是以SKU爲記錄單元。
  2. SPU:(Standard Product Unit,即標準化產品單元),是一組標準化信息的集合,例如“iPhone 7 Plus”就是一個SPU。
  3. 類目:即分類樹。電商常用的有兩層類目:前臺展示類目和後端商品類目。
    前臺類目指的是展示給消費者看的類目,會根據季節、銷售策略、活動進行變動;
    後臺類目屬於基礎數據,不可隨意變動,添加SKU時都需要選擇後臺類目,進行綁定。
  4. 屬性:分爲關鍵屬性、銷售屬性、非關鍵屬性、特殊屬性。
  • 關鍵屬性 是指能夠唯一確定產品的屬性,是必填項,例如手機的屏幕尺寸、型號屬於關鍵屬性。
  • 銷售屬性 是組成SKU的特殊屬性,或稱爲“規格屬性”,例如手機的“顏色”、“內存”。
  • 非關鍵屬性 指的是除關鍵屬性、銷售屬性外的其他屬性,如前置攝象頭像素、後置攝像頭像素、產地、分辨率。
  • 特殊屬性 指需要通過調用其他服務才能獲取到的屬性。

3 商品架構圖

參考下面的商品組成模塊圖,商品模塊的組成較爲複雜,在定義SKU與SPU時,涉及類目、屬性、品牌、生產信息等數據的組合,在定義出SKU後再創建SPU,在SPU上添加商品描述和規格最後就成了商品。根據商品又衍生出了價格管理、評論管理、搜索篩選等模塊。

3.1 商品組成模塊圖

3.2 商品中心核心ER圖

3.3 商品中心整體架構圖

4 商品類目

4.1 類目管理

商品類目分爲兩層:基礎數據類目層(後臺類目)、前臺展示類目層(前臺類目)。那爲什麼要將前、後臺類目分開管理,而不是前、後臺共用一套類目呢?
後臺類目面向商家或供應鏈人員,商品屬性、銷售屬性及品牌等很多數據都是在基礎類目上進行管理;
前臺類目面向用戶,方便用戶查找商品,還可以隨着運營需要去調整。比如而且隨着節日、時令季節變化,運營會經常變更前臺類目。

4.2 後臺類目

後臺類目主要面向平臺運營人員或商家,用於管理商品、屬性和品牌等數據。
後臺類目相對固定,確定了之後不會輕易變更或刪除,如果類目下掛載有商品,就不能刪除或作廢。
類目樹的層次不能太深,一般三層或四層。如果太深,對於商品的管理不太方便。類目樹中最後一層類目稱爲葉子類目,商品必須掛載於葉子類目下。

4.3 前臺類目

前臺類目主要面向用戶,方便用戶篩選查找商品,如圖圖所示。
前臺類目可以根據運營需要,靈活多變。所以處理商品的前端類目時,就應該提供多樣化的前端類目來支持。
前臺類目可支持不同客戶端的設置。PC端、H5端、APP端等
前臺類目不同於固定的後臺類目,編輯很靈活、可重疊、可刪除、可隨時變動,定時生效。

4.4 類目表結構設計

4.1.1 後端類目表設計

 CREATE TABLE `category` (
  `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
  `name` varchar(32) NOT NULL COMMENT '類目名稱',
  `parent_id` bigint(11) NOT NULL COMMENT '父id',
  `leaf` tinyint(4) NOT NULL COMMENT '是否葉子節點 1是 0不是',
  `level` tinyint(4) NOT NULL COMMENT '類目層級',
  `path` varchar(128) DEFAULT NULL COMMENT '完整父級路徑:父父id_父id',
  `sort` int(11) unsigned NOT NULL COMMENT '排序字段',
  `status` tinyint(4) NOT NULL COMMENT '分類狀態:1上架 2下架',
  `del` tinyint(4) unsigned NOT NULL COMMENT '是否刪除',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新時間',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='類目表';

4.4.2 後端類目數據展示

5 SKU

SKU算是電商中最基礎的概念,SKU是最小庫存單元。

以iPhone 8 Plus(SPU)爲例,這個SPU的規格有多種(顏色包含金 色、白色、黑色、玫瑰金、銀色、亮黑、紅色等6種;內存包含32G、 128G、256G等3種),對應18(即3×6)種SKU。比如“iPhone 7 Plus白 色32G”、“iPhone 7 Plus黑色32G”這兩個SKU都能具化到實物。倉庫系統、採購系統、庫存系統等系統都是主要管理SKU。

5.1 sku表設計

CREATE TABLE `sku` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `sku_no` varchar(32) DEFAULT '' COMMENT '商品序列號',
  `sku_name` varchar(50) DEFAULT NULL COMMENT '商品名稱',
  `sku_description` varchar(256) DEFAULT NULL COMMENT '商品描述',
  `sku_type` tinyint(4) DEFAULT NULL COMMENT '商品類型:1實物商品、2會員商品、3增值商品,4虛擬物品',
  `status` tinyint(4) NOT NULL COMMENT '狀態 1未上架2.已上架 3.已下架',
  `sort` int(10) DEFAULT '0' COMMENT '排序',
  `boundle` tinyint(4) unsigned DEFAULT '0' COMMENT '是否組合商品 1是 0否',
  `create_by` int(11) unsigned NOT NULL COMMENT '創建人ID',
  `update_by` int(11) unsigned DEFAULT NULL COMMENT '修改人ID',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
  `update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',
  PRIMARY KEY(`id`) USING BTREE,
  UNIQUE KEY `uk_sku_no` (`sku_no`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8mb4 COMMENT = '商品表'

5.2 sku表數據

5.3 sku屬性表

擴展性1:動態無限制創建屬性數量。

CREATE TABLE `sku_attr` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `sku_no` varchar(32) DEFAULT '' COMMENT '商品序列號',
  `sku_attrs` json DEFAULT NULL COMMENT 'sku屬性(商品屬性)',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
  `update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',
  PRIMARY KEY(`id`) USING BTREE,
  UNIQUE KEY `uk_sku_no` (`sku_no`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8mb4 COMMENT = '商品屬性表'

5.4 sku屬性數據

不創建新字段,還可以用sql查詢,你得到了什麼啓發?

5.5 sku動態表單

擴展性2:根據不同類目加載不同屬性渲染動態表單。

將一組屬性掛載到類目來實現動態表單,你得到了什麼啓發?

5.6 商品類目關聯

CREATE TABLE `category_to_goods` (
  `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
  `category_id` bigint(20) DEFAULT NULL COMMENT '類目id',
  `goods_no` varchar(32) DEFAULT NULL COMMENT '商品編號',
  `goods_type` tinyint(4) DEFAULT NULL COMMENT '商品類型:1sku、2spu',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新時間',
  `is_deleted` tinyint(4) unsigned NOT NULL DEFAULT '0' COMMENT '是否刪除:0-否,1-是',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COMMENT='類目商品關聯表';

5.7 組合sku關係表

CREATE TABLE `bundle_to_sku` (
  `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
  `goods_id` bigint(20) DEFAULT NULL COMMENT '商品id, 組合商品id',
  `bundle_id` bigint(20) DEFAULT NULL COMMENT '組合商品id',
  `quantity` int(11) DEFAULT NULL COMMENT '商品數量',
  `entity_type` tinyint(4) DEFAULT '1' COMMENT '商品的類型:1sku,2組合商品',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新時間',
  `is_deleted` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否刪除:0-否,1-是',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `idx_bundle_to_goods_bundle_id_index` (`bundle_id`) USING BTREE,
  KEY `idx_bundle_to_goods_object_id_entity_type_index` (`object_id`,`entity_type`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='套裝和sku關聯表||套裝和spu關聯表';

5.8 組合sku關係數據

sku數據

5.9 創建組合商品表單

6 屬性

6.1 屬性管理

爲了方便商品管理,我們需要在系統中建立一套屬性庫。在定義一個屬性時,需要掛載在類目下,區分屬性分類(關鍵屬性、銷售屬性、非關鍵屬性、特殊屬性),並確定屬性值、顯示類型(單選、多選、可自定義)、是否必填。

6.2 屬性的應用場景

  1. 添加商品時候的商品表單渲染。在添加商品時,可通過選擇葉子類目,將掛載到葉子類目的屬性渲染到表單上。
  2. 在客戶端對可根據不同的屬性進行搜索、篩選商品。
  3. 在spu頁面用戶可利用商品規格(銷售屬性)來定位出不同的sku。
  4. 商品詳情頁面可展示出後臺配置的屬性參數數據。

6.3 屬性表設計

CREATE TABLE `attribute` (
  `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
  `name` varchar(32) NOT NULL DEFAULT '' COMMENT '屬性名稱',
  `code` varchar(32) DEFAULT NULL COMMENT '屬性代碼(非必填)',
  `attr_type` tinyint(4) NOT NULL COMMENT '屬性應用:1商品屬性,2銷售屬性,3特殊屬性',
  `value_type` tinyint(4) DEFAULT NULL COMMENT '屬性值類型:1:字符串,2:數字',
  `fill_type` tinyint(4) NOT NULL COMMENT '填寫類型:1填寫型(字符),2填寫型(僅整數數字),3選擇型(單選值,非id)4選擇型(多選值,非id),5多輸入框展示型',
  `is_filter` tinyint(4) unsigned NOT NULL COMMENT '是否支持前臺篩選:0否 1是',
  `status` tinyint(11) NOT NULL COMMENT '狀態:1 未上架 2已上架 3已下架',
  `is_deleted` tinyint(4) unsigned NOT NULL COMMENT '是否刪除',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改時間',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COMMENT='屬性表';

6.4 屬性表數據

6.5 屬性枚舉表設計

CREATE TABLE `attribute_enum` (
  `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
  `attr_id` bigint(20) NOT NULL COMMENT '屬性id',
  `attr_code` varchar(32) DEFAULT NULL,
  `enum_code` bigint(11) DEFAULT NULL COMMENT 'enumcode',
  `enum_value` varchar(32) NOT NULL COMMENT '屬性枚舉值名稱',
  `sort` int(11) NOT NULL COMMENT '排序',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新時間',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='屬性枚舉表';

6.6 屬性枚舉表數據

6.7 屬性和類目關聯表設計

CREATE TABLE `category_to_attr` (
  `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
  `category_id` bigint(11) NOT NULL COMMENT '分類id',
  `attr_id` bigint(20) NOT NULL COMMENT '屬性id',
  `is_required` tinyint(4) unsigned NOT NULL COMMENT '是否必填',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新時間',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='分類屬性關聯表';

6.8 動態生成屬性表單

當屬性庫搭建完成後,就會被各個葉子類目調用,添加商品時就需要填寫這些屬性,商品就有了載體,如圖所示。

根據這些屬性便能確定商品的唯一性(SKU)。 淘寶的商品屬性(類目“男裝”→“風衣”) 特別需要注意的是一些規格屬性(如顏色、尺碼等)。很多產品有 多規格,例如衣服、鞋子等。以一雙男鞋爲例,有顏色(假設白、紅、 黑3種顏色),有尺碼(從39~44共6種尺碼),那麼這個SPU(男鞋) 下面就有18個SKU。這些SKU的屬性除了規格屬性外,其他屬性都是一 致的,所以在新建商品時,可聚合到一起,共用其他屬性。

7 SPU

7.1 SPU概念

SPU 是標準化產品單元。SPU與SKU的關係有許多種,可以一對多、一對一, 絕大部分SPU與SKU都是一對一,多規格的SPU和SKU之間是通過規格屬性來連接的。SPU的庫存是由其對應的SKU庫存共同決定的。

以iPhone 11(SPU)爲例,這個SPU的規格有多種(顏色包含白色、黑色、黃金、紫色、綠色、紅色等6種;內存包含32G、 128G、256G等3種),對應18(即3×6)種SKU。比如“iPhone 11 白色 64G”、“iPhone 11 黑色 64G”這兩個SKU都能具化到實物。倉庫系統、採購系統、庫存系統等系統都是主要管理SKU。 在日常運營中也很常見一個SKU對應多個SPU。

7.2 SPU和規格設計

CREATE TABLE `spu` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
  `name` varchar(64) DEFAULT NULL COMMENT 'spu名稱',
  `detail` varchar(256) DEFAULT NULL COMMENT '商品介紹',
  `status` tinyint(4) DEFAULT NULL COMMENT '狀態 1未上架2.已上架 2.已下架',
  `spu_specs` json DEFAULT NULL COMMENT '商品規格',
  `creator_id` bigint(20) DEFAULT NULL COMMENT '創建者',
  `is_deleted` tinyint(1) unsigned DEFAULT '0' COMMENT '是否刪除,0:未刪除 1:已刪除',
  `sort` int(10) DEFAULT '0' COMMENT '排序',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新時間',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='spu';

7.3 SPU和規格數據

sku屬性數據

spu表單圖片

7.4 spu和sku關聯表

CREATE TABLE `spu_to_sku` (
  `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
  `sku_no` varchar(32) NOT NULL DEFAULT '' COMMENT 'sku id',
  `spu_no` varchar(32) NOT NULL DEFAULT '' COMMENT 'spu id',
  `is_deleted` tinyint(1) DEFAULT '0' COMMENT '是否刪除,0:未刪除 1:已刪除',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新時間',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `idx_spu_to_sku` (`spu_no`,`sku_no`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COMMENT='spu商品關聯表';

8 價格設計

價格包括:成本價、原價、售賣價、定金、膨脹金等會隨着需求的不斷增加,尤其是一些在線教育等垂直行業電商對金額會有各種玩法。

CREATE TABLE `sku_price` (
  `id` bigint(11) NOT NULL AUTO_INCREMENT,
  `sku_id` bigint(11) unsigned NOT NULL COMMENT '商品id',
  `sku_no` varchar(20) NOT NULL DEFAULT '' COMMENT '商品編號',
  `sku_type` tinyint(4) NOT NULL COMMENT '商品類型: 1單sku 2組合sku',
  `sub_goods` tinyint(4) NOT NULL COMMENT '是否子商品:0否1是',
  `bundle_id` bigint(20) DEFAULT NULL COMMENT '組合商品id 默認 空',
  `price` decimal(10, 2) NOT NULL COMMENT '價格',
  `price_type` varchar(32) NOT NULL COMMENT '價格類型枚舉(1.商品原價REAL_PRICE 2.售賣價SELL_PRICE 3.售賣底價... )',
  `currency_type` tinyint(4) NOT NULL DEFAULT '1' COMMENT '貨幣類型:1人民幣 2虛擬幣',
  `enable` tinyint(4) unsigned DEFAULT '1' COMMENT '是否啓用 0 不啓用 1  啓用',
  `create_by` int(11) unsigned NOT NULL COMMENT '創建人ID',
  `update_by` int(11) unsigned DEFAULT NULL COMMENT '修改人ID',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
  `update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `idx_sku_id` (`sku_id`) USING BTREE,
  KEY `idx_sku_no` (`sku_no`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8mb4 COMMENT = '商品價格表' "

擴展性3:不創建新字段,同一個商品可支持多種價格和貨幣種類

9 總結

本文詳細介紹了商品中心設計擴展性設計思想,並在設計方面做了各維度分析。

擴展性總結如下:

動態無限制創建屬性數量。
根據不同類目加載不同屬性渲染動態表單。
不創建新字段,同一個商品可支持多種價格和貨幣種類。

希望自己總結的擴展性思想可以讓大家在開發過程中有所啓發。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章