1 文章概述

产品在电商范畴中是一个非常重要的范畴,交易行为前提是有产品信息存在。本文咱们剖析产品表根本规划,其它杂乱场景能够在此根底上进行扩展。需求阐明第一本文所用数据是测试数据,可能与实在数据有偏差,仅供演示。第二本文展示产品中心字段,一些通用字段不展示。


2 产品类目

2.1 根本信息

类目表明产品分类并且具有层级联系:

  • 一级类目:图书
    • 二级类目:文学
      • 三级类目:小说

  • 一级类目:电脑
    • 二级类目:电脑配件
      • 三级类目:显卡

  • 一级类目:生鲜
    • 二级类目:生果
      • 三级类目:苹果

2.2 三种类目

2.2.1 后台类目

后台类目有两个特色:标准和安稳。标准表明后台类目是业界通用的,并且层级不宜过多,一般不超过三级。安稳表明后台类目一旦确认不能轻易修正,否则规划上下游许多数据改变,工作量非常大,所以改变权限必须收敛到渠道运营


2.2.2 前台类目

计算机范畴有一句话:任何问题都能够经过加一层解决。为了解决后台类目不能灵活调整这个问题,业界在后台类目上规划了前台类目。

运营人员一般会对后台类目进行简化和收拾,更加符合用户检索习惯,前台类目能够自在相关后台类目,能够一对多、多对一或许多对多。许多电商网站PC首页展示的类目一般是前台类目。


2.2.3 店肆类目

店肆类目灵活度更好能够交由商家办理,商家能够依据本身经营策略调整店肆类目,提高交易率,一般只支撑两层。综上所述咱们看一个实例:


(1) 后台类目

  • 一级类目:生鲜
    • 二级类目:生果
      • 三级类目:西瓜

(2) 前台类目

  • 一级类目:食品/生鲜/特产
    • 二级类目:新鲜生果
      • 三级类目:西瓜

(3) 店肆类目

  • 一级类目:夏日清凉
    • 二级类目:甜甜大西瓜

2.3 后台类目表

CREATE TABLE `category_1_background` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `category_id` varchar(64) NOT NULL COMMENT '类目ID',
  `category_name` varchar(128) NOT NULL COMMENT '类目称号',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uq_category_id` (`category_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='一级后台类目表';
CREATE TABLE `category_2_background` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `category_id` varchar(64) NOT NULL COMMENT '类目ID',
  `category_name` varchar(128) NOT NULL COMMENT '类目称号',
  `category_1_id` varchar(64) NOT NULL COMMENT '一级分类ID',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uq_category_id` (`category_id`),
  KEY `idx_category_1_id` (`category_1_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='二级后台类目表';
CREATE TABLE `category_3_background` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `category_id` varchar(64) NOT NULL COMMENT '类目ID',
  `category_name` varchar(128) NOT NULL COMMENT '类目称号',
  `category_2_id` varchar(64) NOT NULL COMMENT '二级分类ID',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uq_category_id` (`category_id`),
  KEY `idx_category_2_id` (`category_2_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='三级后台类目表';
insert  into `category_1_background`(`category_id`,`category_name`) values ('700','电子设备');
insert  into `category_2_background`(`category_id`,`category_name`,`category_1_id`) values ('800','通讯设备','700');
insert  into `category_3_background`(`category_id`,`category_name`,`category_2_id`) values ('900','手机','800');

3 产品特点

3.1 特点分类

3.1.1 要害特点

要害特点是产品本质特点,要害特点中最中心两个特点是品牌和类型,一旦确认这两个特点等价于确认SPU(Standard Product Unit)标准化办理单元,例如品牌是小米,类型是10。在实践中这两个特点不放在特点表:

  • 类型是一种特殊特点
    • 作为SPU表一个字段
  • 品牌是一种特殊特点
    • 品牌根底信息一张独立表
    • SPU表记录对应品牌ID

其它要害特点例如屏幕尺度,CPU类型,CPU核数仍是经过特点表承载。


3.1.2 出售特点

出售特点又称为标准特点,假如要害特点确认,一旦出售特点再确认,那么就能够确认SKU(Stock Keeping Unit)库存计量单位,能够理解为库房中什物产品,每一个SKU都有一个库存数量与一个价格与之对应。电商常见出售特点有色彩、容量、版别、套餐等等。

例如要害特点品牌是小米,类型是10,出售特点色彩是黑色和蓝色,容量是128G和256G,那么共有四个SKU:

  • 小米 10 黑色 128G
  • 小米 10 黑色 256G
  • 小米 10 蓝色 128G
  • 小米 10 蓝色 256G

3.1.3 描绘特点

除了要害特点与出售特点,其它特点称为描绘信息。


3.2 特点与特点值

特点和特点值由渠道运营人员设置。特点有两种类型:挑选与自定义。关于挑选类型,运营人员需求为特点设置特点值。关于自定义类型,无需设置特点值。例如渠道运营人员新增以下两个特点:

  • 色彩:挑选类型,特点值包含黑色、蓝色、红色
  • 分量:自定义类型,无需渠道运营设置特点值,商家自行填写

3.3 类目与特点

每个类目对应的特点是不同的,所以渠道运营人员初始化特点和特点值之后,还要建立类目与特点相相联系。因为同一个特点关于不同类目重要性不同,所以在设置类目和特点联系时需求设置以下信息:

  • 特点类型:特点关于类目是要害特点、出售特点、描绘特点
  • 是否必填:特点关于类目是否必填
  • 产品维度:特点关于类目是SPU维度仍是SKU维度

特点还有承继联系,渠道运营人员不仅能够为三级类目设置特点,还能够为一级和二级类目设置特点。例如运营人员为二级类目设置A、B两种特点,那么这个二级类目下三级类目一起也具有A、B两种特点,类目与特点联系如下图:


商品领域十二张基础表设计思路与实现


3.4 特点数据表

3.4.1 特点表

CREATE TABLE `attribute` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `attribute_id` varchar(64) NOT NULL COMMENT '特点ID',
  `biz_type` tinyint(1) NOT NULL COMMENT '1挑选 2自定义',
  `attribute_name` varchar(128) NOT NULL COMMENT '特点称号',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uq_attribute_id` (`attribute_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='特点表';
insert into `attribute` (`attribute_id`, `biz_type`, `attribute_name`) values('100','1','色彩');
insert into `attribute` (`attribute_id`, `biz_type`, `attribute_name`) values('200','1','存储容量');
insert into `attribute` (`attribute_id`, `biz_type`, `attribute_name`) values('300','2','分量');
insert into `attribute` (`attribute_id`, `biz_type`, `attribute_name`) values('400','2','屏幕尺度');

3.4.2 特点值表

CREATE TABLE `attribute_value` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `attribute_value_id` varchar(64) NOT NULL COMMENT '特点值ID',
  `attribute_value` varchar(128) NOT NULL COMMENT '特点值称号',
  `attribute_id` varchar(64) NOT NULL COMMENT '特点ID',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uq_attribute_value_id` (`attribute_value_id`),
  KEY `idx_attribute_id` (`attribute_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='特点值表';
--色彩特点值
insert  into `attribute_value`(`attribute_value_id`,`attribute_value`,`attribute_id`) values ('1001','蓝色','100');
insert  into `attribute_value`(`attribute_value_id`,`attribute_value`,`attribute_id`) values ('1002','黑色','100');
insert  into `attribute_value`(`attribute_value_id`,`attribute_value`,`attribute_id`) values ('1003','红色','100');
--容量特点值
insert  into `attribute_value`(`attribute_value_id`,`attribute_value`,`attribute_id`) values ('2001','64G','200');
insert  into `attribute_value`(`attribute_value_id`,`attribute_value`,`attribute_id`) values ('2002','128G','200');
insert  into `attribute_value`(`attribute_value_id`,`attribute_value`,`attribute_id`) values ('2003','256G','200');

3.4.3 特点与类目联系表

CREATE TABLE `relation_category_attribute` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `relation_id` varchar(64) NOT NULL COMMENT '联系ID',
  `attribute_id` varchar(64) NOT NULL COMMENT '特点ID',
  `category_id` varchar(64) NOT NULL COMMENT '类目ID',
  `category_level` tinyint(1) NOT NULL COMMENT '类目层级',
  `attribute_type` tinyint(1) NOT NULL COMMENT '特点类型 1要害特点 2出售特点 3描绘特点',
  `must_fill` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否必填',
  `product_scope` tinyint(1) NOT NULL COMMENT '产品维度 1spu 2sku',  
  PRIMARY KEY (`id`),
  UNIQUE KEY `uq_relation_id` (`relation_id`),
  KEY `idx_category_id_attribute_id` (`category_id`,`attribute_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='特点与类目联系表';
insert  into `relation_category_attribute`(`relation_id`,`attribute_id`,`category_id`,`category_level`,`attribute_type`,`must_fill`,`product_scope`) values ('10000000','100','900',3,2,1,2);
insert  into `relation_category_attribute`(`relation_id`,`attribute_id`,`category_id`,`category_level`,`attribute_type`,`must_fill`,`product_scope`) values ('10000001','200','900',3,2,1,2);
insert  into `relation_category_attribute`(`relation_id`,`attribute_id`,`category_id`,`category_level`,`attribute_type`,`must_fill`,`product_scope`) values ('10000002','300','900',3,3,1,2);
insert  into `relation_category_attribute`(`relation_id`,`attribute_id`,`category_id`,`category_level`,`attribute_type`,`must_fill`,`product_scope`) values ('10000003','400','900',3,1,1,1);

3.4.4 品牌表

CREATE TABLE `product_brand` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `brand_id` varchar(128) NOT NULL COMMENT '品牌ID',
  `brand_cn_name` varchar(128) NOT NULL COMMENT '品牌中文名',
  `brand_en_name` varchar(128) NOT NULL COMMENT '品牌英文名',
  `logo_url` text COMMENT '品牌Logo',
  `brand_story` text COMMENT '品牌故事',
  PRIMARY KEY (`id`),
  KEY `idx_brand_id` (`brand_id`)  
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='品牌表';
insert  into `product_brand`(`brand_id`,`brand_cn_name`,`brand_en_name`) values ('1000','小米','MI');

4 产品表

4.1 根本概念

第三章节特点相关信息由渠道运营人员设置,为商家保护产品信息定制一个标准,这时商家能够依据设置自己的产品信息。

  • SPU:标准化办理单元,产品特点最小聚合
  • SKU:库存计量单位,在库房中什物产品,每一个SKU对应一个库存数量与一个价格
  • SN:序列号,在库房中每一个实体产品

咱们仍是看一个手机示例:

  • SPU:小米 10
  • SKU:小米 10 黑色 128G
    • 库存3个
    • 单价2000元
  • SN:对应三个序列号
    • SN1
    • SN2
    • SN3

4.2 表规划思路

  • SPU
    • 主表:SPU根底信息
      • 图片、品牌、类型、类目
    • 相关表:SPU、特点、特点值相关表
  • SKU
    • 主表:SKU根底信息
      • 图片、spuId、价格、库存
    • 相关表:SKU、特点、特点值相关表
  • SN
    • 主表:SN根底信息以及与SKU联系
      • 序列号、skuId

4.3 产品表

4.3.1 SPU主表

CREATE TABLE `product` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `product_id` varchar(64) NOT NULL COMMENT '产品id',
  `shop_id` varchar(64) NOT NULL COMMENT '店肆id',  
  `brand_id` bigint(20) NOT NULL COMMENT '品牌id',
  `product_model` varchar(256) NOT NULL COMMENT '产品类型',
  `product_name` varchar(256) NOT NULL COMMENT '产品称号',
  `sale_status` tinyint(1) NOT NULL COMMENT '出售状况 1上架 2下架',  
  `category_3_id` varchar(64) NOT NULL COMMENT '三级分类id',
  `img_url` text COMMENT '图片途径',
  `description` text COMMENT '产品描绘',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uq_product_id` (`product_id`),
  KEY `idx_brand_id` (`brand_id`),
  KEY `idx_category_3_id` (`category_3_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='SPU';
insert into product(`product_id`, `shop_id`, `brand_id`, `product_model`, `product_name`, `category_3_id`, `sale_status`) values ('100', 'shop_1','100', '10', '小米10手机', '900', 1);

4.3.2 SPU与特点联系表

CREATE TABLE `relation_product_attribute` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `relation_id` varchar(64) NOT NULL COMMENT '联系ID',
  `product_id` varchar(64) DEFAULT NULL COMMENT '产品ID',
  `attribute_id` varchar(64) NOT NULL COMMENT '特点ID',
  `attribute_value_id` varchar(64) DEFAULT NULL COMMENT '特点值ID',
  `custom_attribute_value` varchar(256) DEFAULT NULL COMMENT '自定义特点值',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uq_relation_id` (`relation_id`),
  KEY `idx_product_id` (`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='SPU与特点联系表';
insert into relation_product_attribute(`relation_id`, `product_id`, `attribute_id`, `attribute_value_id`, `custom_attribute_value`) values ('20000000', '100', '400', NULL, '6.67英寸');

4.3.3 SKU主表

CREATE TABLE `product_sku` (
  `id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `sku_id` VARCHAR(64) NOT NULL COMMENT 'skuId',
  `sku_name` VARCHAR(128) NOT NULL COMMENT 'sku称号', 
  `product_id` VARCHAR(64) NOT NULL COMMENT '产品id',
  `sale_status` tinyint(1) NOT NULL COMMENT '出售状况 1上架 2下架',    
  `orgin_price` DOUBLE NOT NULL COMMENT '原价',  
  `discount_price` DOUBLE NOT NULL COMMENT '优惠价格', 
  `stock_count` INT(11) NOT NULL COMMENT '剩余库存',  
  `lock_stock_count` INT(11) NOT NULL COMMENT '确定库存',
  `sale_stock_count` INT(11) NOT NULL COMMENT '出售量',  
  `sku_img_url` TEXT COMMENT '图片途径',
  `sku_description` TEXT COMMENT '产品描绘',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uq_sku_id` (`sku_id`),
  KEY `idx_product_id` (`product_id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='SKU';
insert  into `product_sku`(`sku_id`,`sku_name`,`product_id`,`orgin_price`,`discount_price`,`stock_count`,`lock_stock_count`,`sale_stock_count`,`sku_img_url`,`sku_description`, `sale_status`) values ('200','小米 10 蓝色 128G', '100',3000,3000,3,1,1000,NULL,NULL, 1);

4.3.4 SKU与特点联系表

CREATE TABLE `relation_product_sku_attribute` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `relation_id` varchar(64) NOT NULL COMMENT '联系ID',
  `sku_id` varchar(64) DEFAULT NULL COMMENT 'skuId',
  `attribute_id` varchar(64) NOT NULL COMMENT '特点ID',
  `attribute_value_id` varchar(64) DEFAULT NULL COMMENT '特点值ID',
  `custom_attribute_value` varchar(256) DEFAULT NULL COMMENT '自定义特点值',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uq_relation_id` (`relation_id`),
  KEY `idx_sku_id` (`sku_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='SKU与特点联系表';
insert into relation_product_sku_attribute(`relation_id`, `sku_id`, `attribute_id`, `attribute_value_id`, `custom_attribute_value`) values ('30000000', '200', '100', '1001', NULL);
insert into relation_product_sku_attribute(`relation_id`, `sku_id`, `attribute_id`, `attribute_value_id`, `custom_attribute_value`) values ('30000001', '200', '200', '2002', NULL);
insert into relation_product_sku_attribute(`relation_id`, `sku_id`, `attribute_id`, `attribute_value_id`, `custom_attribute_value`) values ('30000002', '200', '300', NULL, '173克');

4.3.5 SN表

CREATE TABLE `product_sku_sn` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `sn_id` varchar(64) NOT NULL COMMENT '序列号ID',
  `sku_id` varchar(64) DEFAULT NULL COMMENT 'skuId',
  `sn` varchar(64) DEFAULT NULL COMMENT '序列号',
  `status` tinyint(1) NOT NULL COMMENT '状况 1未售 2已售',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uq_sn_id` (`sn_id`),
  UNIQUE KEY `uq_sn_sku` (`sku_id`,`sn`),
  KEY `idx_sku_id` (`sku_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='SN';
insert into product_sku_sn(`sn_id`, `sku_id`, `sn`, `status`) values ('40000000', '200', 'SN-1', 1);
insert into product_sku_sn(`sn_id`, `sku_id`, `sn`, `status`) values ('40000001', '200', 'SN-2', 1);
insert into product_sku_sn(`sn_id`, `sku_id`, `sn`, `status`) values ('40000002', '200', 'SN-3', 1);

5 延伸常识

5.1 触及人物

产品操作总体上分为渠道运营商家两个人物,渠道运营主要保护类目、特点、类目与特点联系信息,相当于为商家保护产品设置标准。商家主要保护spu、sku、spu详细特点值是什么、sku详细特点值是什么、上下架状况。


5.2 自增主键不赋予事务含义

以产品表为例,咱们不该该以id作为产品Id,应该设置product_id作为产品Id,要求product_id大局仅有,这样便于当数据量过大时进行分库分表。


5.3 允许适度冗余

产品表是一个高读写比典型,可能看10次才会发生1次购买行为,所以假如能够一次查询就查出所需信息对功能会更友爱。

本文表规划并没有进行冗余,例如假如要冗余能够在relation_product_sku_attribute表中新增attribute_value字段记录特点值。冗余问题便是数据一致性,例如当特点值发生变化时,上述字段也要同步进行修正。


5.4 合理使用ES

正如上述章节所述,产品表是一个高读写比的典型,咱们期望一次查询能够将所需信息查询出来,而不是跨多张表去查询,可是咱们又不想在事务表冗余数据。

咱们能够将产品信息平铺到ES中一个索引,这个索引具有产品悉数字段信息,例如在查询产品列表或许商详时能够直接拜访这个索引。


5.5 库存单独成表

product_sku有库存字段,关于库存字段修正相对而言比较多,其它信息改变比较少,因为假如呈现下单、购买、退款行为,库存信息就会发生变化。所以能够将sku主表库存字段单独成表,从而减轻主表压力。


6 文章总结

本文经过介绍类目、特点、品牌、SPU、SKU、SN引出产品十二张根底表:

一级类目表:category_1_background
二级类目表:category_2_background
三级类目表:category_3_background
特点表:attribute
特点值表:attribute_value
类目与特点联系表:relation_category_attribute
品牌表:product_brand
SPU表:product
SKU表:product_sku
SN表:product_sku_sn
SPU与特点联系表:relation_product_attribute
SKU与特点联系表:relation_product_sku_attribute

这些十二张根底表从不同侧面描绘了产品信息,其它杂乱场景能够在这些根底表上进行扩展。一起在第五章节咱们评论了五个延伸常识,期望本文对大家有所帮助。