专栏首页cwl_Java商城项目-商品规格数据结构

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

1.商品规格数据结构

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

1.1.SPU和SKU

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

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

以图为例来看:

  • 本页的 华为Mate10 就是一个商品集(SPU)
  • 因为颜色、内存等不同,而细分出不同的Mate10,如亮黑色128G版。(SKU)

可以看出:

  • SPU是一个抽象的商品集概念,为了方便后台的管理。
  • SKU才是具体要销售的商品,每一个SKU的价格、库存可能会不一样,用户购买的是SKU而不是SPU

1.2.数据库设计分析

1.2.1.思考并发现问题

弄清楚了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:库存
颜色?
内存?
硬盘?

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

1.2.2.分析规格参数

仔细查看每一种商品的规格你会发现:

虽然商品规格千变万化,但是同一类商品(如手机)的规格是统一的,有图为证:

华为的规格:

三星的规格:

也就是说,商品的规格参数应该是与分类绑定的。每一个分类都有统一的规格参数模板,但不同商品其参数值可能不同

如下图所示:

1.2.3.SKU的特有属性

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

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

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

这样说起来,似乎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标记

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 快速学习SpringBoot-Java配置

    在入门案例中,我们没有任何的配置,就可以实现一个SpringMVC的项目了,快速、高效!

    cwl_java
  • 商城项目-商品新增

    我们刚刚在查询时,已经实现创建了MyGoodsForm.vue,并且已经在MyGoods中引入。

    cwl_java
  • 前端基础-CSS属性选择器

    cwl_java
  • 【微服务】150:什么是SKU和SPU?

    具体数据需要我们从数据库中查询,因为我这边业务还未完成,所以显示的数据为:“该分组下没有参数”。

    刘小爱
  • PrometheusReportingTask

    该处理器通过创建metrics(http)端点来报告Prometheus格式的指标数据,该端点可用于应用程序的外部监控。ReportingTask报告一组关于J...

    用户5475193
  • 机器学习中的矩阵向量求导(五) 矩阵对矩阵的求导

        在矩阵向量求导前4篇文章中,我们主要讨论了标量对向量矩阵的求导,以及向量对向量的求导。本文我们就讨论下之前没有涉及到的矩阵对矩阵的求导,还有矩阵对向量,...

    刘建平Pinard
  • 基于scrapy的腾讯社会招聘爬虫(进阶版)

    此进阶篇相较于前一篇每个item多了工作职责(jobDescription),工作要求(jobRequirement)两个字段。 另外从技术的角度上来说,前一...

    潇洒坤
  • Facebook和微软发布机器学习工具ONNX,PyTorch训练的模型轻松转到Caffe2

    陈桦 编译整理 量子位 出品 | 公众号 QbitAI ? Facebook和微软周四在各自的博客中发布了ONNX,即“开放神经网络转换”工具。 简单地说,这...

    量子位
  • 【CSS】格仔背景

    CSS代码 * { margin: 0; padding: 0; } html, body { width: 100%; height: 100%; } bod...

    企鹅号小编
  • Google披露:大规模集群管理工具Borg的细节

    大数据文摘

扫码关注云+社区

领取腾讯云代金券