关于设计:电商通用型商品中心设计

6次阅读

共计 9786 个字符,预计需要花费 25 分钟才能阅读完成。

作者:京东物流 顶峰

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 总结

本文具体介绍了商品核心设计扩展性设计思维,并在设计方面做了各维度剖析。

扩展性总结如下:

动静无限度创立属性数量。
依据不同类目加载不同属性渲染动静表单。
不创立新字段,同一个商品可反对多种价格和货币品种。

心愿本人总结的扩展性思维能够让大家在开发过程中有所启发。

正文完
 0