【电商】商品表SPU和规格表SKU表的概念及设计参考

本文为转载综述文章,有更改。

所参考原文链接地址:https://blog.csdn.net/rulaixiong/article/details/119894036

https://blog.csdn.net/lovoo/article/details/130528601

【电商】商品表SPU和规格表SKU表的设计

不管开发B2C、B2B2C、还是B2B等电商项目,不可避免的要实现上面的详情页面。页面展示中,商品的名称、商品的主图、商品的详情都容易搞定。就是商品种类繁多后,每一种商品具有不同的规格,不同的规格就会对应不同的价格和库存,这点比较难搞。以上面图为例,不同的机身颜色和存储容量的组合,会出现不同的库存以及不同的价格。

在进一步学习之前,需要了解一下SPU和SKU的概念。

SPU (Standard Product Unit)即标准化产品单位,是商品信息聚合的最小单位,是一组可复用、易检索的标准化信息的集合,该集合描述了一个产品的特性。通俗点讲,属性值、特性相同的商品就可以称为一个SPU。

SKU(stock keeping unit)即库存量单位,是物理上不可分割的最小存货单元。正因为它在物理上是不可分割的最小存货单元,所以也就可以通过SKU来确定具体的货物存量。

如一件M码(四个尺码:S码、M码、L码、X码)的粉色(三种颜色:粉色、黄色、黑色)Zara女士风衣,其中M码、粉色就是一组SKU的组合。

SKU在生成时, 会根据属性生成相应的笛卡尔积,根据一组SKU可以确定商品的库存情况,那么上面的Zara女士风衣一共有4 * 3 = 12个SKU组合。

常规的业务流程是这样的:用户通过一个标有商品简略信息的入口点进一个商品页面,这时会有几个不同的配置、颜色、尺寸供选择,用户选择时需要判断这个商品是否有库存。

这一系列操作中一个商品的页面会是一个SPU,最后检查的库存就是SKU。

【电商】商品表SPU和规格表SKU表的设计

通过上图某东关于华为笔记本电脑MateBook D 14的商品页面我们不难在图中发现红框是SPU信息,蓝框是SKU信息。

SPU只定义了一个产品,但不是商品。一个SPU可以拥有多个SKU(不同规格组合),SKU和SPU是一种多对一的关系,SKU才是定义了产品下的具体商品。

  • SPU和SKU都是属性的集合,SPU是公共属性的集合,SKU是独有属性的集合。
  • SPU定义了产品,但不是商品,产品描述了商品的公共属性,不影响库存和价格。
  • SKU定义了商品,是在SPU的基础上描述了其独有的属性,一个SPU可以拥有多个SKU,影响库存和价格。
  • SKU是库存量的最小存货单位,也是用户能够选择的最小单位是实际购买的商品。每一个sku可以有独立的价格,当库存减少时减少的实际是sku的库。
  • 也可以这样认为只有确定了一个SPU才能获得关于这个SPU的所有SKU信息,而不能通过一组不同的SKU来确定SPU信息。

下面针对sku如何实现这个功能,而不相干的字段就屏蔽掉。

【电商】商品表SPU和规格表SKU表的设计

分类的数据库表,商品太多,一般会按照分类进行管理。比如分手机的分类、电脑的分类。

CREATE TABLE `category` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`parent_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '父级主键',
`category_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '分类名称',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='分类表';

【电商】商品表SPU和规格表SKU表的设计
属性key的数据库表,一般一个分类,会拥有差不多的属性。比如手机,都有内存、颜色等属性。
【电商】商品表SPU和规格表SKU表的设计
属性value的数据库表,根据数据库设计的范式原则,属性及属性值会分开不同的表进行存储,所以会多一个表来存属性值。

CREATE TABLE `attribute_value` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `attribute_id` int(10) unsigned NOT NULL COMMENT '属性key外键',
  `attribute_value` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '属性value值',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='属性value表';

【电商】商品表SPU和规格表SKU表的设计
有了上面这些前提表,这个时候后台新增商品的时候,就需要商品表和规格表。新增商品信息spu及规格信息sku,先存储goods信息,存储成功后再存储goods_specs。一起是一个事务。

CREATE TABLE `goods` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`category_id` int(10) unsigned NOT NULL COMMENT '分类外键',
`attribute_list` text CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '规格列表',
PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='商品表';

【电商】商品表SPU和规格表SKU表的设计