电商⽹站,商品规格的设计思路
1.商品规格数据结构
企业网站设计思路
如图,这是⼀个商品详情页,它包括商品名称、价格、描述、规格等等数据信息。我们应该如何把这些数据存储到数据库,如何设计数据模型,是⼀个很关键的问题。如果设计的不好,会⼤⼤增加开发、运
营、维护的成本。
⾸先,我们需要知道,这些参数不能存在⼀张表⾥,因为 每个商品 的规格参数不同,⼀个商品的每个规格的价格、名字等参数都不同。⼀个商品和该商品的所有规格是⼀对多的关系,所以要分成多个表存储。
1.1.SPU和SKU
为了更准确描述商品及细分差别,抽象出两个概念:SPU和SKU,了解⼀下:
SPU:Standard Product Unit (标准产品单位) ,⼀组具有共同属性的商品集
就⽐如说是,上图的Iphone11,就是⼀个spu(它不是⼀个商品,⽽是⼀组),是⼀组有共同属性的商品,它们的共同属性就是,它们都叫Iphone11。(⽐如,Iphone11有⾦⾊、银⾊、有256G、64G。所以Iphone是⼀组商品。)
SPU是⼀个抽象的商品集概念,为了⽅便后台的管理。
SKU:Stock Keeping Unit(库存量单位),SPU商品集因具体特性不同⽽细分的每个商品
SKU才是具体要销售的商品,每⼀个SKU的价格、库存可能会不⼀样,⽤户购买的是SKU⽽不是SPU
⽐如说,绿⾊的、64G、优惠套装1的Iphone11就是⼀个sku。把所有规格参数,排列组合组成了⼀个商品集spu。⼀个sku才是⼀个具体的商品,仔细数数还是很多的。
所以不要以为1个商品存起来很简单。
1.2.数据库设计分析
1.2.1.思考并发现问题
弄清楚了SPU和SKU的概念区分,接下来我们⼀起思考⼀下该如何设计数据库表。
⾸先来看SPU,SPU的表应该有哪些字段来描述?
id:主键
title:标题
description:描述
specification:规格
packaging_list:包装
after_service:售后服务
comment:评价
category_id:商品分类
brand_id:品牌
spu⾥都是某个商品集⾥所有商品的相同点,⽐如名称都叫Iphone11、商品分类、品牌也都⼀样。
再看下SKU应该有的数据库字段
id:主键
spu_id:关联的spu
price:价格
images:图⽚
stock:库存
颜⾊?
内存?
硬盘?
除了上⾯的所有商品都有的规格参数(如,id,spu_id,price等),不同的商品种类还会有它独特的参数,⽐如,⼿机有内存⼤⼩、⾐服有尺码⼤⼩等等,这些独特的规格参数该如何解决?
其实颜⾊、内存、硬盘属性都是规格参数中的字段。所以,要解决这个问题,⾸先要能清楚规格参数。
1.2.2.分析规格参数
仔细查看每⼀种商品的规格你会发现:
虽然商品规格千变万化,但是同⼀类商品(如⼿机)的规格是统⼀的,⽐如说,所有⼿机都有 品牌、内存、型号、长度、宽度、重量、操作系统等等参数。在搜索商品时,通常也会有按商品种类搜索的功能。
⽐如这种搜索。
1.2.3.SKU的特有属性
SKU中会有⼀些特殊属性,⽤来区分不同的SKU,我们称为SKU特有属性。如Iphone11的颜⾊、内存属性。
不同种类的商品,⼀个⼿机,⼀个⾐服,其SKU属性不相同。
同⼀种类的商品,⽐如都是⾐服,SKU属性基本是⼀样的,都是颜⾊、尺码等。
这样说起来,似乎SKU的特有属性也是与分类相关的?事实上,仔细观察你会发现,SKU的特有属性是商品规格参数的⼀部分。
也就是说,我们没必要单独对SKU的特有属性进⾏设计,它可以看做是规格参数中的⼀部分。这样规格参数中的属性可以标记成两部分:spu下所有sku共享的规格属性(称为全局属性)
每个sku不同的规格属性(称为特有属性)
1.2.4.搜索属性
过滤条件中的屏幕尺⼨、运⾏内存、⽹路、机⾝内存、电池容量、CPU核数等,在规格参数中都能到 。
也就是说,规格参数中的数据,将来会有⼀部分作为搜索条件来使⽤。我们可以在设计时,将这部分
属性标记出来,将来做搜索的时候,作为过滤条件。要注意的是,⽆论是SPU的全局属性,还是SKU的特有属性,都有可能作为搜索过滤条件的,并不冲突,⽽是有⼀个交集:
1.3.规格参数表
1.3.1.表结构
规格参数的格式:
可以看到规格参数是分组的,每⼀组都有多个参数键值对。不过对于规格参数的模板⽽⾔,其值现在是不确定的,不同的商品值肯定不同,模板中只要保存组信息、组内参数信息即可。
因此我们设计了两张表:
tb_spec_group:组,与商品分类关联
tb_spec_param:参数名,与组关联,⼀对多
1.3.
2.规格组
规格参数分组表:tb_spec_group
规格组有3个字段:
id:主键
cid:商品分类id,⼀个分类下有多个模板
name:该规格组的名称。
1.3.
2.规格参数
规格参数表:tb_spec_param
按道理来说,我们的规格参数就只需要记录参数名、组id、商品分类id即可。但是这⾥却多出了很多字段,为什么?
还记得我们之前的分析吧,规格参数中有⼀部分是 SKU的通⽤属性,⼀部分是SKU的特有属性,⽽且其中会有⼀些将来⽤作搜索过滤,这些信息都需要标记出来。
1.通⽤属性
generic来标记是否为通⽤属性:
true:代表通⽤属性
false:代表sku特有属性