这是电商系统两个非常重要的概念,如果你能够理解这里面的关系网,会对你的代码思路更加清晰!

SPU和SKU

SPU:Standard Product Unit(标准化产品单元)

商品信息聚合的最小单元,一组可复用、易检索的标准化信息集合,该集合描述了一个产品的特性。

SKU:Stock Keep Unit(库存量单位)

库存进出计量的基本单元,可以是以件,盒,托盘等为单位。SKU这是对于大型连锁超市DC(配送中心)物流管理的一个必要的方法。现在已经被引申为产品统一编号的简称,每种产品均对应有唯一的 SKU号。换句话说,就是购买的最小单位。

例如小米11就是一个商品的最小单元,称之为SPU;而小米11 8G+128G就是一个商品的具体落实,称之为SKU;

引申出来的就有一个 基本属性[规格参数]销售属性

基本属性

在京东小米11的详细页,我们可以看到一栏 ”规格与包装“,大致内容如下

而在 iPhone12的页面上,我们同样可以看到几乎相同的基本属性,只是属性值不同。

由此我们可以观察到这些 基本属性[规格参数] 与 “手机” 分类有关,而且是三级分类下的。

因此同一个分类下,不同的SPU基本属性字段相同,具体属性值不同。但同个SPU下,不同的SKU属性值是一样的。例如小米11和iPhone11都有机身长度,机身重量这些属性,但值不同。而对于小米11来说,8G和16G的机身重都是196g。

值得注意的是,属性较多我们一般还得整个分组,在上面的图中我们观察到了主体是个分组,里面放了入网型号,产品名称,上市年份,首销日期,上市月份。

销售属性

在小米11购买页中,你选择不同的SKU,价格和库存量等各自的特殊属性是不同的,这就是每个SKU的销售属性。

image-20210115141723635

数据库设计

pms_category【商品三级分类】

代码名称数据类型(MYSQL)主键内容示例
cat\_id分类idBIGINT(19)150
name分类名称CHAR(50) 手机
parent\_cid父分类idBIGINT(19) 12
cat\_level层级INT(10) 3
show\_status是否显示[0-不显示,1显示]TINYINT(3) 1

pms_attr【商品属性】

代码名称数据类型(MYSQL)主键内容示例1内容示例2
attr\_id属性idBIGINT(19)120210
attr\_name属性名CHAR(30) 上市年份库存
value\_type值类型[0-为单个值,1-可以选择多个值]TINYINT(3) 00
search\_type是否需要检索[0-不需要,1-需要]TINYINT(3) 10
value\_select可选值列表[用逗号分隔]CHAR(255) 2020,2021大量
attr\_type属性类型[0-销售属性,1-基本属性,2-既是销售属性又是基本属性]TINYINT(3) 12
enable启用状态[0 - 禁用,1 - 启用]BIGINT(19) 11
catelog\_id所属分类BIGINT(19) 150150
show\_desc快速展示【是否展示在介绍上;0-否 1-是】,在sku中仍然可以调整TINYINT(3) 00

pms_attr_group【属性分组】

代码名称数据类型(MYSQL)主键内容示例
attr\_group\_id分组idBIGINT(19)130
attr\_group\_name组名CHAR(20) 主体
sort排序INT(10) 1
catelog\_id所属分类idBIGINT(19) 150

pms_attr_attrgroup_relation【属性&属性分组关联】

代码名称数据类型(MYSQL)主键内容示例
ididBIGINT(19)140000
attr\_id属性idBIGINT(19) 120
attr\_group\_id属性分组idBIGINT(19) 130
attr\_sort属性组内排序INT(10) 1

解读:上市年份为基本属性,归类在主体分组中,他们均属于150分类,即手机,在关联表是 120-130

pms_spu_info【spu信息】

代码名称数据类型(MYSQL)主键内容示例
id商品idBIGINT(19)110
spu\_name商品名称VARCHAR(200) 小米11
spu\_description商品描述VARCHAR(1000) 小米11牛逼
catalog\_id所属分类idBIGINT(19) 150
brand\_id品牌idBIGINT(19) 11111111
publish\_status上架状态[0 - 下架,1 - 上架]TINYINT(3) 1

pms_product_attr_value【spu属性值】

代码名称数据类型(MYSQL)主键内容示例
ididBIGINT(19)190
spu\_id商品idBIGINT(19) 110
attr\_id属性idBIGINT(19) 120
attr\_name属性名VARCHAR(200) 上市年份
attr\_value属性值VARCHAR(200) 2021
attr\_sort顺序INT(10) 1
quick\_show快速展示【是否展示在介绍上;0-否 1-是】TINYINT(3) 1

解读:有一个spu,名为小米11,它旗下有个属性为上市年份,属性值为2021

pms_sku_info【sku信息】

代码名称数据类型(MYSQL)主键内容示例
sku\_idskuIdBIGINT(19)222
spu\_idspuIdBIGINT(19) 110
sku\_namesku名称VARCHAR(255) 小米11 8G
sku\_descsku介绍描述VARCHAR(2000) 小米11 8G牛逼
catalog\_id所属分类idBIGINT(19) 150
brand\_id品牌idBIGINT(19) 11111111
sku\_title标题VARCHAR(255) 小米11 8G
price价格DECIMAL(18,4) 3999
sale\_count销量BIGINT(19) 10000

pms_sku_sale_attr_value【sku销售属性&值】

代码名称数据类型(MYSQL)主键备注
ididBIGINT(19)211
sku\_idsku_idBIGINT(19) 222
attr\_idattr_idBIGINT(19) 210
attr\_name销售属性名VARCHAR(200) 库存
attr\_value销售属性值VARCHAR(200) 9999999

看完这么多表,相信你已经懵逼了,其实这确实是相对比较绕和复杂,对后端代码也是个不小的挑战。

首先我定义了一个三级分类,id为150,叫做手机。

定义两个属性,id为120的是上市年份,为基本属性;210的是库存,为销售属性。

定义一个基础属性分组,id为130,名为主体,归在手机分类。

将130和120相关联,也就是将上市年份归在主体。

定义一个SPU,也就是商品 小米11 id为110

填写spu属性值,也就是让小米11的上市年份定义为2021

定义一个SKU,也就是购买单位,小米11 8G id为222

填写sku属性值,也就是小米11 8G的库存定义为9999999

最终结果,在手机分类下有一个基础信息分组-主体,主体下有上市年份,手机分类下还有一个销售属性-库存。定义一个小米11的SPU,一个小米11 8G的SKU,让小米11的上市年份定义为2021,小米11 8G库存定义为9999999。


Last modification:March 6, 2021
如果觉得我的文章对你有用,请随意赞赏