4

电商通用型商品中心设计 - 京东云开发者

 1 year ago
source link: https://www.cnblogs.com/Jcloud/p/17275226.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

作者:京东物流 高峰

构建一个电商通用型商品中心,可支持商品的种类和属性繁多,可以售卖实物、虚拟、会员、服务类商品。每一种商品具有不同的规格,不同的规格的商品有多种价格,商品可支持多种货币的支付。

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 商品组成模块图

get?code=ZDI4MzhhYTY3YWQ4ZDFlZTg4ZDIwODZhYzIwYzlmNDksMTY4MDIyNTYwMDc5MQ==

3.2 商品中心核心ER图

get?code=OGQ0MTIyNGE0MzhiNTc4MDEyNGQxOTY5ZGM0MzIwYmIsMTY4MDIyNTYwMDc5MQ==

3.3 商品中心整体架构图

get?code=N2IxZWY1MTM4ZDZiYmUxYzM4NjY4ZTA5MjkzNTgwZWIsMTY4MDIyNTYwMDc5MQ==

4 商品类目

4.1 类目管理

商品类目分为两层:基础数据类目层(后台类目)、前台展示类目层(前台类目)。那为什么要将前、后台类目分开管理,而不是前、后台共用一套类目呢?
后台类目面向商家或供应链人员,商品属性、销售属性及品牌等很多数据都是在基础类目上进行管理;
前台类目面向用户,方便用户查找商品,还可以随着运营需要去调整。比如而且随着节日、时令季节变化,运营会经常变更前台类目。

4.2 后台类目

后台类目主要面向平台运营人员或商家,用于管理商品、属性和品牌等数据。
后台类目相对固定,确定了之后不会轻易变更或删除,如果类目下挂载有商品,就不能删除或作废。
类目树的层次不能太深,一般三层或四层。如果太深,对于商品的管理不太方便。类目树中最后一层类目称为叶子类目,商品必须挂载于叶子类目下。

get?code=NjFlYTYxZjBlZTI0OTE5NmIyODMwOGU2N2YwOWZmNDQsMTY4MDIyNTYwMDc5Mg==

4.3 前台类目

前台类目主要面向用户,方便用户筛选查找商品,如图图所示。
前台类目可以根据运营需要,灵活多变。所以处理商品的前端类目时,就应该提供多样化的前端类目来支持。
前台类目可支持不同客户端的设置。PC端、H5端、APP端等
前台类目不同于固定的后台类目,编辑很灵活、可重叠、可删除、可随时变动,定时生效。

get?code=ZTJmZWYzNGEyNjNiNmJjNmE4M2QxNmYzM2QzNGExNjMsMTY4MDIyNTYwMDc5Mg==

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 后端类目数据展示

get?code=ZDc5NTUzZGJhMGVhOGRmOTFjMjU4N2IxNDMxNmExMDMsMTY4MDIyNTYwMDc5Mg==

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表数据

get?code=OTM2ZjQ4NjQ1ODM4MGE5MzljMzRiZDNiMDQ4ZjI0MDUsMTY4MDIyNTYwMDc5Mg==

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属性数据

get?code=OGE3NWZkOGJiOWEzZTg1YmQ0YWMwNTU3MWYwZmNjYjAsMTY4MDIyNTYwMDc5Mg==

不创建新字段,还可以用sql查询,你得到了什么启发?

5.5 sku动态表单

扩展性2:根据不同类目加载不同属性渲染动态表单。

get?code=ODFjOGM3MGI2ZTc4YTI3NzgwN2ViNjYzNzE2Y2M3ZjYsMTY4MDIyNTYwMDc5Mg==

将一组属性挂载到类目来实现动态表单,你得到了什么启发?

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关系数据

get?code=Y2Y2YWEzOGExZjZjNTk0ZGM3ODMwMDJlMTQ1Y2U3NjksMTY4MDIyNTYwMDc5Mg==

sku数据

get?code=YTcyYjFmMTIyNDIwNTE3ODVlYmFjNTJkZGNjYmFmNmUsMTY4MDIyNTYwMDc5Mg==

5.9 创建组合商品表单

get?code=NGZmZDAxNzBjNmY4M2YwMzAyMTRiNjQ2OWZiMDJiNmUsMTY4MDIyNTYwMDc5Mg==

6.1 属性管理

为了方便商品管理,我们需要在系统中建立一套属性库。在定义一个属性时,需要挂载在类目下,区分属性分类(关键属性、销售属性、非关键属性、特殊属性),并确定属性值、显示类型(单选、多选、可自定义)、是否必填。

get?code=ZTYzMWFkNGQ2NjY2YjU1NjFiMmY5YzM0N2I4NzdkZGYsMTY4MDIyNTYwMDc5Mg==

6.2 属性的应用场景

  1. 添加商品时候的商品表单渲染。在添加商品时,可通过选择叶子类目,将挂载到叶子类目的属性渲染到表单上。
  2. 在客户端对可根据不同的属性进行搜索、筛选商品。
  3. 在spu页面用户可利用商品规格(销售属性)来定位出不同的sku。
  4. 商品详情页面可展示出后台配置的属性参数数据。
get?code=YzBjNjc2MjdhNThjNTZjYTk5OTA5NDA4Y2E3YmZjYWIsMTY4MDIyNTYwMDc5Mg==

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 属性表数据

get?code=ZjBjZmMzZjJjNmRiMWI3ZjU3NzVlMDZkN2RhZDQ3YTYsMTY4MDIyNTYwMDc5Mg==

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 属性枚举表数据

get?code=YTZjNzNiZTA3Y2NlZTYwOTJmOGQ5Yjk2ZTlmNjcxNjIsMTY4MDIyNTYwMDc5Mg==

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 动态生成属性表单

当属性库搭建完成后,就会被各个叶子类目调用,添加商品时就需要填写这些属性,商品就有了载体,如图所示。

get?code=ZDI2NzUyNjM3NWZiOTg1NmNhMGRjODM1NTI3NzZjYjIsMTY4MDIyNTYwMDc5Mw==

根据这些属性便能确定商品的唯一性(SKU)。 淘宝的商品属性(类目“男装”→“风衣”) 特别需要注意的是一些规格属性(如颜色、尺码等)。很多产品有 多规格,例如衣服、鞋子等。以一双男鞋为例,有颜色(假设白、红、 黑3种颜色),有尺码(从39~44共6种尺码),那么这个SPU(男鞋) 下面就有18个SKU。这些SKU的属性除了规格属性外,其他属性都是一 致的,所以在新建商品时,可聚合到一起,共用其他属性。

7.1 SPU概念

SPU 是标准化产品单元。SPU与SKU的关系有许多种,可以一对多、一对一, 绝大部分SPU与SKU都是一对一,多规格的SPU和SKU之间是通过规格属性来连接的。SPU的库存是由其对应的SKU库存共同决定的。

get?code=NzUzYzFlNzgyNmY2MjdmNDg0MzdhYWY1YWE1ZmQ2ZjMsMTY4MDIyNTYwMDc5Mw==

以iPhone 11(SPU)为例,这个SPU的规格有多种(颜色包含白色、黑色、黄金、紫色、绿色、红色等6种;内存包含32G、 128G、256G等3种),对应18(即3×6)种SKU。比如“iPhone 11 白色 64G”、“iPhone 11 黑色 64G”这两个SKU都能具化到实物。仓库系统、采购系统、库存系统等系统都是主要管理SKU。 在日常运营中也很常见一个SKU对应多个SPU。

get?code=YTIwMzMzZmJmMGVjODAzMzJlZDY0MTJjZGQ2MWUxYjUsMTY4MDIyNTYwMDc5Mw==

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和规格数据

get?code=NjVlY2NiZDNhYjc5ZDMyYzJiMWNhNjRkYTkyOWZjMDYsMTY4MDIyNTYwMDc5Mw==

sku属性数据

get?code=NjA3NDJmYjJhMmQ0YWUyY2ZkMjEwYjkxOWQxZjZjMzksMTY4MDIyNTYwMDc5Mw==

spu表单图片

get?code=YWI4MmM2NTZlYmUyZDExNWY4YTNkZmY2ZWE4Y2FlMWMsMTY4MDIyNTYwMDc5Mw==

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:不创建新字段,同一个商品可支持多种价格和货币种类

本文详细介绍了商品中心设计扩展性设计思想,并在设计方面做了各维度分析。

扩展性总结如下:

动态无限制创建属性数量。
根据不同类目加载不同属性渲染动态表单。
不创建新字段,同一个商品可支持多种价格和货币种类。

希望自己总结的扩展性思想可以让大家在开发过程中有所启发。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK