SPU和SKU数据结构设计思路

SPU和SKU数据结构设计思路电商网站的商品种类繁多 每一件商品 其属性又有差别

大家好,欢迎来到IT知识分享网。

1.商品规格数据结构

电商网站的商品种类繁多,每一件商品,其属性又有差别。为了更准确描述商品及细分差别,抽象出两个概念:SPU和SKU,了解一下:

1.1.SPU和SKU

请添加图片描述

  • 本页的 华为Mate10 就是一个商品集(SPU)
  • 因为颜色、内存等不同,而细分出不同的Mate10,如亮黑色128G版。(SKU)
    可以看出:
  • SPU是一个抽象的商品集概念,为了方便后台的管理。
  • SKU才是具体要销售的商品,每一个SKU的价格、库存可能会不一样,用户购买的是SKU而不是SPU

1.2.数据库设计分析

1.2.1.SPU、SKU表字段

SPU表字段:

id:主键 title:标题 description:描述 specification:规格 packaging_list:包装 after_service:售后服务 comment:评价 category_id:商品分类 brand_id:品牌 
id:主键 spu_id:关联的spu price:价格 images:图片 stock:库存 颜色? 内存? 硬盘? 

不同的商品分类,可能属性是不一样的,比如手机有内存,衣服有尺码,我们是全品类的电商网站,这些不同的商品的不同属性,如何设计到一张表中?

1.2.2.分析规格参数

请添加图片描述
也就是说,商品的规格参数应该是与分类绑定的。每一个分类都有统一的规格参数模板,但不同商品其参数值可能不同
如下图所示:
请添加图片描述


1.2.3.SKU的特有属性

请添加图片描述
SKU的特有属性是商品规格参数的一部分
也就是说,我们没必要单独对SKU的特有属性进行设计,它可以看做是规格参数中的一部分。这样规格参数中的属性可以标记成两部分:

  • 所有sku共享的规格属性(称为全局属性)
  • 每个sku不同的规格属性(称为特有属性)

请添加图片描述

1.2.4.搜索属性

打开一个搜索页,过滤的条件:

请添加图片描述
过滤条件中的屏幕尺寸、运行内存、网路、机身内存、电池容量、CPU核数等,在规格参数中都能找到:

请添加图片描述
也就是说,规格参数中的数据,将来会有一部分作为搜索条件来使用。我们可以在设计时,将这部分属性标记出来,将来做搜索的时候,作为过滤条件。要注意的是,无论是SPU的全局属性,还是SKU的特有属性,都有可能作为搜索过滤条件的,并不冲突,而是有一个交集:

请添加图片描述

1.3.规格参数表

1.3.1.表结构

先看下规格参数表:

CREATE TABLE `tb_specification` ( `category_id` bigint(20) NOT NULL COMMENT '规格模板所属商品分类id', `specifications` varchar(3000) NOT NULL DEFAULT '' COMMENT '规格参数模板,json格式', PRIMARY KEY (`category_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品规格参数模板,json格式。'; 

很奇怪是吧,只有两个字段。特别需要注意的是第二个字段:

  • specificatons:规格参数模板,json格式
    为什么是一个json?我们看下规格参数的格式:

请添加图片描述
如果按照传统数据库设计,这里至少需要3张表:

  • group:代表组,与商品分类关联
  • param_key:属性名,与组关联,一对多
  • param_value:属性备选值,与属性名关联,一对多
    这样程序的复杂度大大增加,但是提高了数据的复用性。
    我们的解决方案是,采用json来保存整个规格参数模板,不需要额外的表,一个字符串就够了。

1.3.2.json结构分析

先整体看一下:

请添加图片描述

  • 因为规格参数分为很多组,所以json最外层是一个数组。
  • 数组中是对象类型,每个对象代表一个组的数据,对象的属性包括:
    • group:组的名称
    • params:该组的所有属性

接下来是params:

请添加图片描述
主芯片这一组为例:

  • group:注明,这里是主芯片
  • params:该组的所有规格属性,因为不止一个,所以是一个数组。这里包含四个规格属性:CPU品牌,CPU型号,CPU频率,CPU核数。每个规格属性都是一个对象,包含以下信息:
    • k:属性名称
    • searchable:是否作为搜索字段,将来在搜索页面使用,boolean类型
    • global:是否是SPU全局属性,boolean类型。true为全局属性,false为SKU的特有属性
    • options:属性值的可选项,数组结构。起约束作用,不允许填写可选项以外的值,比如CPU核数,有人添10000核岂不是很扯淡
    • numerical:是否为数值,boolean类型,true则为数值,false则不是。为空也代表非数值
    • unit:单位,如:克,毫米。如果是数值类型,那么就需要有单位,否则可以不填。
      上面的截图中所有属性都是全局属性,我们来看看内存,应该是特有属性:
      请添加图片描述总结下:

  • 规格参数分组,每组有多个参数
  • 参数的 k代表属性名称,没有值,具体的SPU才能确定值
  • 参数会有不同的属性:是否可搜索,是否是全局、是否是数值,这些都用boolean值进行标记:
    • SPU下的多个SKU共享的参数称为全局属性,用global标记
    • SPU下的多个SKU特有的参数称为特有属性
    • 如果参数是数值类型,用numerical标记,并且指定单位unit
    • 如果参数可搜索,用searchable标记

3.SPU和SKU数据结构

规格确定以后,就可以添加商品了,先看下数据库表

3.1.SPU表

3.1.1.表结构

SPU表:

CREATE TABLE `tb_spu` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'spu id', `title` varchar(255) NOT NULL DEFAULT '' COMMENT '标题', `sub_title` varchar(255) DEFAULT '' COMMENT '子标题', `cid1` bigint(20) NOT NULL COMMENT '1级类目id', `cid2` bigint(20) NOT NULL COMMENT '2级类目id', `cid3` bigint(20) NOT NULL COMMENT '3级类目id', `brand_id` bigint(20) NOT NULL COMMENT '商品所属品牌id', `saleable` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否上架,0下架,1上架', `valid` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否有效,0已删除,1有效', `create_time` datetime DEFAULT NULL COMMENT '添加时间', `last_update_time` datetime DEFAULT NULL COMMENT '最后修改时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=208 DEFAULT CHARSET=utf8 COMMENT='spu表,该表描述的是一个抽象的商品,比如 iphone8'; 
CREATE TABLE `tb_spu_detail` ( `spu_id` bigint(20) NOT NULL, `description` text COMMENT '商品描述信息', `specifications` varchar(3000) NOT NULL DEFAULT '' COMMENT '全部规格参数数据', `spec_template` varchar(1000) NOT NULL COMMENT '特有规格参数及可选值信息,json格式', `packing_list` varchar(1000) DEFAULT '' COMMENT '包装清单', `after_service` varchar(1000) DEFAULT '' COMMENT '售后服务', PRIMARY KEY (`spu_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

3.1.2.spu中的规格参数

前面讲过规格参数与商品分类绑定,一个分类下的所有SPU具有类似的规格参数。SPU下的SKU可能会有不同的规格参数,因此我们计划是这样:

  • SPU中保存全局的规格参数信息。
  • SKU中保存特有规格参数。
    以手机为例,品牌、操作系统等肯定是全局属性,内存、颜色等肯定是特有属性。
    当你确定了一个SPU,比如小米的:红米4X
    全局属性举例:


品牌:小米 型号:红米4X 

特有属性举例:

颜色:[香槟金, 樱花粉, 磨砂黑] 内存:[2G, 3G] 机身存储:[16GB, 32GB] 

来看下我们的 表如何存储这些信息:

3.1.2.1.specifications字段

首先是specifications,其中保存全部规格参数信息,因此也是一个json格式:

整体来看: 请添加图片描述
整体看上去与规格参数表中的数据一样,也是一个数组,并且分组,每组下有多个参数
展开一组来看
请添加图片描述
可以看到,与规格参数表中的模板相比,最大的区别就是,这里指定了具体的值,因为商品确定了,其参数值肯定也确定了。
特有属性
刚才看到的是全局属性,那么特有属性在这个字段中如何存储呢?
请添加图片描述
我们发现特有属性也是有的,但是,注意看这里是不确定具体值的,因为特有属性只有在SKU中才能确定。这里只是保存了options,所有SKU属性的可选项。
在哪里会用到这个字段的值呢,商品详情页的规格参数信息中:
请添加图片描述









3.1.2.2.spec_template字段

请添加图片描述
可以看出,里面只保存了规格参数中的特有属性,而且格式进行了大大的简化,只有属性的key,和待选项。
为什么要冗余保存一份?
因为很多场景下我们只需要查询特有规格属性,如果放在一起,每次查询再去分离比较麻烦。
比如,商品详情页展示可选的规格参数时:
请添加图片描述




3.2.SKU表

3.2.1.表结构

CREATE TABLE `tb_sku` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'sku id', `spu_id` bigint(20) NOT NULL COMMENT 'spu id', `title` varchar(255) NOT NULL COMMENT '商品标题', `images` varchar(1000) DEFAULT '' COMMENT '商品的图片,多个图片以‘,’分割', `price` bigint(15) NOT NULL DEFAULT '0' COMMENT '销售价格,单位为分', `indexes` varchar(100) COMMENT '特有规格属性在spu属性模板中的对应下标组合', `own_spec` varchar(1000) COMMENT 'sku的特有规格参数,json格式,反序列化时应使用linkedHashMap,保证有序', `enable` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime NOT NULL COMMENT '添加时间', `last_update_time` datetime NOT NULL COMMENT '最后修改时间', PRIMARY KEY (`id`), KEY `key_spu_id` (`spu_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='sku表,该表表示具体的商品实体,如黑色的64GB的iphone 8'; 

还有一张表,代表库存:

CREATE TABLE `tb_stock` ( `sku_id` bigint(20) NOT NULL COMMENT '库存对应的商品sku id', `seckill_stock` int(9) DEFAULT '0' COMMENT '可秒杀库存', `seckill_total` int(9) DEFAULT '0' COMMENT '秒杀总数量', `stock` int(9) NOT NULL COMMENT '库存数量', PRIMARY KEY (`sku_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='库存表,代表库存,秒杀库存等信息'; 

3.2.2.sku中的特有规格参数

3.2.2.1.indexes字段

在SPU表中,已经对特有规格参数及可选项进行了保存,结构如下:

{ 
    "机身颜色": [ "香槟金", "樱花粉", "磨砂黑" ], "内存": [ "2GB", "3GB" ], "机身存储": [ "16GB", "32GB" ] } 
  • 红米4X,香槟金,2GB内存,16GB存储
  • 红米4X,磨砂黑,2GB内存,32GB存储
    你会发现,每一个属性值,对应于SPUoptions数组的一个选项,如果我们记录下角标,就是这样:
  • 红米4X,0,0,0
  • 红米4X,2,0,1
    既然如此,我们是不是可以将不同角标串联起来,作为SPU下不同SKU的标示。这就是我们的indexes字段。

请添加图片描述
这个设计在商品详情页会特别有用:
请添加图片描述
当用户点击选中一个特有属性,你就能根据 角标快速定位到sku。


3.2.2.2.own_spec字段

看结构:

{ 
   "机身颜色":"香槟金","内存":"2GB","机身存储":"16GB"} 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/136787.html

(0)
上一篇 2025-06-25 11:45
下一篇 2025-06-25 12:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信