电商系统,剖析商品模块中商品表(spu)、规格表(sku)的数据库是如何设计的

电商系统,剖析商品模块中商品表(spu)、规格表(sku)的数据库是如何设计的_第1张图片
不管开发B2C、B2B2C、还是B2B等电商项目,不可避免的要实现上面的详情页面。页面展示中,商品的名称、商品的主图、商品的详情都容易搞定。就是商品种类繁多后,每一种商品具有不同的规格,不同的规格就会对应不同的价格和库存,这点比较难搞。以上面图为例,不同的机身颜色和存储容量的组合,会出现不同的库存以及不同的价格。

下面针对sku如何实现这个功能,而不相干的字段就屏蔽掉。
电商系统,剖析商品模块中商品表(spu)、规格表(sku)的数据库是如何设计的_第2张图片
分类的数据库表,商品太多,一般会按照分类进行管理。比如分手机的分类、电脑的分类。

CREATE TABLE `category` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `parent_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '父级主键',
  `category_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '分类名称',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='分类表';

电商系统,剖析商品模块中商品表(spu)、规格表(sku)的数据库是如何设计的_第3张图片
属性key的数据库表,一般一个分类,会拥有差不多的属性。比如手机,都有内存、颜色等属性。

CREATE TABLE `attribute_key` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `category_id` int(255) unsigned NOT NULL COMMENT '分类外键',
  `attribute_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '属性ke值',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='属性key表';

在这里插入图片描述
属性value的数据库表,根据数据库设计的范式原则,属性及属性值会分开不同的表进行存储,所以会多一个表来存属性值。

CREATE TABLE `attribute_value` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `attribute_id` int(10) unsigned NOT NULL COMMENT '属性key外键',
  `attribute_value` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '属性value值',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='属性value表';

电商系统,剖析商品模块中商品表(spu)、规格表(sku)的数据库是如何设计的_第4张图片
有了上面这些前提表,这个时候后台新增商品的时候,就需要商品表和规格表。新增商品信息spu及规格信息sku,先存储goods信息,存储成功后再存储goods_specs。一起是一个事务。

CREATE TABLE `goods` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `category_id` int(10) unsigned NOT NULL COMMENT '分类外键',
  `attribute_list` text CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '规格列表',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='商品表';

在这里插入图片描述

CREATE TABLE `goods_specs` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `goods_id` int(10) unsigned NOT NULL COMMENT '商品外键',
  `goods_specs` text CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '商品规格',
  `goods_stock` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '商品库存',
  `goods_price` decimal(10,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '商品价格',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='规格表';

电商系统,剖析商品模块中商品表(spu)、规格表(sku)的数据库是如何设计的_第5张图片
这样子,我们就把把不同商品的不同规格存储到数据库了

电商系统,剖析商品模块中商品表(spu)、规格表(sku)的数据库是如何设计的_第6张图片
当前端点击不同的机身颜色、存储容量后,前端带着goods_id和goods_specs字段去请求goods_specs表获取库存和价格,类似执行了下面这条sql语句

SELECT * FROM goods_specs WHERE goods_id='1' AND goods_specs='{"内存": "128GB", "颜色": "黑色"}';

电商系统,剖析商品模块中商品表(spu)、规格表(sku)的数据库是如何设计的_第7张图片
整体逻辑跑通后,剩下的就是在这个基础上不断的优化完善,最终达到产品想要的效果。

你可能感兴趣的:(mysql,数据库,mysql,sql)