谷粒商城商品规格数据结构学习笔记(SPU&SKU)

SPU

Standard Product Unit (标准产品单位) ,一组具有共同属性的商品集

SKU

Stock Keeping Unit(库存量单位),SPU商品集因具体特性不同而细分的每个商品

总体来看下SPU、SKU表结构的设计

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';

SPU详情表(垂直拆分)

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;

SKU表

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='库存表,代表库存,秒杀库存等信息';

因为库存字段写频率较高,而SKU的其它字段以读为主,因此我们将两张表分离。

特别需要注意的是sku表中的indexes字段和own_spec字段。sku中应该保存特有规格参数的值,就在这两个字段中。

以华为手机的页面展示入手,请看下图

  • 如上图,华为Mate10 就是一个商品集(SPU)

  • 因为颜色、内存等不同,而细分出不同的Mate10,如亮黑色128G版。(SKU)

可以看出:

  • SPU是一个抽象的商品集概念,为了方便后台的管理。

  • SKU才是具体要销售的商品,每一个SKU的价格、库存可能会不一样,用户购买的是SKU而不是SPU

弄清楚了SPU和SKU的概念,接下来我们一起思考一下该如何设计数据库表。

首先来看SPU,大家一起思考下SPU应该有哪些字段来描述?

id:主键
title:标题
description:描述
specification:规格
packaging_list:包装
after_service:售后服务
comment:评价
category_id:商品分类
brand_id:品牌

似乎并不复杂,但是大家仔细思考一下,商品的规格字段你如何填写?

不同商品的规格不一定相同,数据库中要如何保存?

SKU 又该如何设计呢?

id:主键
spu_id:关联的spu
price:价格
images:图片
stock:库存
颜色?
内存?
硬盘?

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

商品规格千变万化,但是同一类商品(如手机)的规格是统一的,看下图

华为手机规格

三星手机规格

比较这俩来看,商品的规格参数应该是与分类绑定的。每一个分类都有统一的规格参数模板,但不同商品其参数值可能不同。  如下图所示:

SKU的特有属性

什么是SKU特有属性?

SKU特有属性指的是SPU中会有一些特殊属性,用来区分不同的SKU。如华为META10的颜色、内存属性。

不同种类的商品,一个手机,一个衣服,其SKU属性不相同。

同一种类的商品,比如都是衣服,SKU属性基本是一样的,都是颜色、尺码等。

然而,仔细观察之后你会发现,SKU的特有属性是商品规格参数的一部分,如图所示:

没必要单独对SKU的特有属性进行设计,它可以看做是规格参数中的一部分。这样规格参数中的属性可以标记成两部分:

  • 所有sku共享的规格属性(称为全局属性)

  • 每个sku不同的规格属性(称为特有属性)

如下图所示,商品分类表、商品表、SKU表、规格参数模板表之间的关系

对于商品的搜索,不仅涉及SPU,还会涉及到SKU

搜索条件:屏幕尺寸、运行内存、网路、机身内存、电池容量、CPU核数等,在规格参数中都能找到,如下图所标识。

规格参数中的数据,会有一部分作为搜索条件来使用。在设计时,将这部分属性标记出来,作为搜索条件。不管SPU的全局属性,还是SKU的特有属性,都有可能作为搜索过滤条件的。

规格参数表

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格式。';

为什么上述表中specifications是json?

按照传统数据库设计,这里至少需要3张表:

  • group:代表组,与商品分类关联

  • param_key:属性名,与组关联,一对多

  • param_value:属性备选值,与属性名关联,一对多

这样程序的复杂度大大增加,但是提高了数据的复用性。

然而,采用json来保存整个规格参数模板,不需要额外的表,一个字段就够了。灵活,扩展性强!

主芯片这一组为例:

  • 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标记

一个分类下的所有SPU具有类似的规格参数。SPU下的SKU可能会有不同的规格参数,因此我们计划是这样:

  • SPU中保存全局的规格参数信息。

  • SKU中保存特有规格参数。

以手机为例,品牌、操作系统等肯定是全局属性,内存、颜色等肯定是特有属性。

当你确定了一个SPU,比如小米的:红米4X

全局属性举例:

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

特有属性举例:

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

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

specifications字段

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

indexes字段

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

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

这些特有属性如果排列组合,会产生12个不同的SKU,而不同的SKU,其属性就是上面备选项中的一个。

比如:

  • 红米4X,香槟金,2GB内存,16GB存储

  • 红米4X,磨砂黑,2GB内存,32GB存储

你会发现,每一个属性值,对应于SPUoptions数组的一个选项,如果我们记录下角标,就是这样:

  • 红米4X,0,0,0

  • 红米4X,2,0,1

既然如此,我们是不是可以将不同角标串联起来,作为SPU下不同SKU的标示。

own_spec字段

看结构:

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

保存的是特有属性的键值对。

SPU中保存的是可选项,但不确定具体的值,而SKU中的保存的就是具体的键值对了。

这样,在页面展示规格参数信息时,就可以根据key来获取值,用于显示。

谷粒商城商品规格数据结构学习笔记(SPUSKU)相关推荐

  1. 谷粒商城分布式高级篇学习笔记

    ElasticSearch Feign调用流程 SynchronousMethodHandler.java的invoke()方法 1.构造请求数据,将对象转为json SynchronousMetho ...

  2. 谷粒商城--商品发布--笔记九

    谷粒商城–商品发布–笔记九 1.基本信息页面 1.选择分类后品牌列表不显示问题 原因 使用到了PubSub 但是没有依赖 解决 npm install --save pubsub-js 在src下的m ...

  3. 商城-商品规格管理-SPU和SKU数据结构

    商城-商品规格管理-SPU和SKU数据结构 3.SPU和SKU数据结构 3.1.SPU表 3.1.1.表结构 3.1.2.spu中的规格参数 3.1.2.1.specifications字段 3.1. ...

  4. 商城项目-商品规格数据结构

    1.商品规格数据结构 乐优商城是一个全品类的电商网站,因此商品的种类繁多,每一件商品,其属性又有差别.为了更准确描述商品及细分差别,抽象出两个概念:SPU和SKU,了解一下: 1.1.SPU和SKU ...

  5. 商城-商品规格管理-商品规格数据结构

    商城-商品规格管理-商品规格数据结构 1.商品规格数据结构 1.1.SPU和SKU 1.2.数据库设计分析 1.2.1.思考并发现问题 1.2.2.分析规格参数 1.2.3.SKU的特有属性 1.2. ...

  6. 谷粒商城--订单服务--高级篇笔记十一

    1.页面环境搭建 1.1 静态资源导入nginx 等待付款 --------->detail 订单页 --------->list 结算页 --------->confirm 收银页 ...

  7. 商品规格数据结构与商品表结构分析

    商品规格数据结构与商品表结构分析: 1. 商品规格数据结构 1.1 规格属性内容 1.2 横表与数表 1.3 表结构 1.3.1 SpecGroup规格组 1.3.2 SpecParam规格参数 1. ...

  8. 微服务项目之电商--17.商品规格数据结构SPU和SKU

    目录 1.商品规格数据结构 1.1.SPU和SKU 1.2.数据库设计分析 1.2.1.思考并发现问题 1.2.2.分析规格参数 1.2.3.SKU的特有属性 1.3.规格参数表 1.3.1.表结构 ...

  9. 谷粒商城--秒杀服务--高级篇笔记十二

    谷粒商城–秒杀服务–高级篇笔记十二 1.后台添加秒杀商品 未配置秒杀服务相关网关 1.1 配置网关 - id: coupon_routeuri: lb://gulimall-couponpredica ...

最新文章

  1. IEEE史上首位华人主席!马里兰大学终身教授刘国瑞当选
  2. matplotlib plot绘图简介
  3. centos rpm安装mysql5.5_CentOS 5.5下RPM方式安装MySQL 5.5 详解
  4. 1.7(java学习笔记)package和import
  5. 关于PHP使用GD库生成的验证码无法在别处显示
  6. Altiumnbsp;designernbsp;学习教程
  7. Appium+Python移动端 实战——教你如何xpath定位自动化测试
  8. MySQL集群:高可用性DBMS
  9. 【redis】mac安装redis
  10. 2012MDCC大会总结
  11. yum源分类:Linux
  12. 爱奇艺动态化框架Qigsaw开源!带来极速原生开发体验和更低crash率
  13. 面向对象的三个基本特征_杂谈:JavaScript面向对象
  14. 软考:数据库系统工程师
  15. Python常用模块库下载及安装
  16. 数据库约束六大约束语句
  17. 延时等待的gcode
  18. 在useEffect中使用了setState,报错
  19. 西部数据移动硬盘设置密码教程
  20. Python-分类问题示例-OneR-学习笔记

热门文章

  1. 关显示器后计算机不休眠状态,win10系统自动关闭显示器而不进入睡眠状态设定的设置步骤...
  2. 使用位运算实现乘法和乘方运算
  3. 用git push 命令向远端提交代码时遇到git everything up-to-date的问题解决
  4. 苏州阿尔卡特上海分公司面试奇遇记
  5. 在线教育源码开源版,这样下载部署即可运行
  6. (洛谷普及组)2的幂次方
  7. QT中出现程序异常结束,The process was ended forcefully的解决方案
  8. Cloudcc通过代码共享数据权限或删除数据权限
  9. PyQt5 教科书级完整教程(一)安装与入门
  10. 从无人货架到智能货柜,无人零售的探索