电商系统商品数据表设计分析与总结

专注于PHP、MySQL、Linux和前端开发,感兴趣的感谢点个关注哟!!!文章整理在GitHub,主要包含的技术有PHP、Redis、MySQL、JavaScript、HTML&CSS、Linux、Java、Golang、Linux和工具资源等相关理论知识、面试题和实战内容。

文章简介

本文针对电商系统中的商品管理模块进行分析,总结出如何设计一个合理的商品管理表。分析的角度,重点放在商品的规格设计上,针对单一规格、多规格和组合规格情况进行如何设计表的总结。

前期分析

对于商品功能,我这里总结了至少需要下面这几张表。

表名 表作用 常用字段
category 商品分类表,存储商品分类信息 一般有数据id,分类名称
goods 商品信息表,存储商品的基础信息 一般有数据id,商品名称,商品封面(外键图片表id),小标题,显示基础价格,销售量,商品状态,商品排序等
goods_category 商品分类关联,存储商品与商品分类的关联关系,存储商品与分类一对多的情况 有商品id,分类的id
image 图片表,存储系统的图片信息 一般有数据id,图片地址,图片名称,图片大小
goods_image 商品图片关联,存储商品与图片的关联关系,存储商品与图片一对多的情况 有商品id,图片id
spec 商品规格组表,存储商品的规格组,例如颜色、重量、材质等分组信息 一般有数据id,组名称
spec_value 商品规格组值表,存储商品的规格组值,一个规格组,有多个规格值,则存储多条数据。如规格组里面有颜色,则颜色对应下面有红色、黄色、蓝色等颜色信息 一般有数据id,规格组id,规格组对应值
goods_spec 商品规格值表,存储商品的信息与规格组值得信息,一般都是一对多的关系,则一个关联关系一行数据 有商品id,规格组值id,库存,销量,编码,重量等信息

单一个规格设计

什么是单一规格,所谓的单一规格就是默认只有一种规格。当用户选择商品下单时,不需要去选择什么规格,直接默认一种商品属性。例如下面的截图示例:

1单一规格文件用户选择界面

对应的逻辑关系如下图:

Snipaste_2021-07-08_19-23-46

管理端截图

2单一规格后台设计界面

箭头的执向,则为本表的id为对应表的外键,颜色相同的则表示同一个键。

多种规格设计

什么是多种规格,多种规格就是指不包含一种规格,例如一个商品中有颜色、重量、大小等等规格,这种不同的规格又有不同的值。

多种规格的表该如何设计呢?其实和上面的逻辑关系是一样的,无非就是一种规格多种值时,添加多条记录而已。

表设计总结

商品记录表

CREATE TABLE goods (
  goods_id int(11) UNSIGNED NOT NULL COMMENT '商品id',
  goods_name varchar(255) NOT NULL DEFAULT '' COMMENT '商品名称',
  selling_point varchar(500) NOT NULL DEFAULT '' COMMENT '商品卖点',
  category_id int(11) UNSIGNED NOT NULL DEFAULT '0' COMMENT '商品分类id',
  deduct_stock_type tinyint(3) UNSIGNED NOT NULL DEFAULT '20' COMMENT '库存计算方式(10下单减库存 20付款减库存)',
  content longtext NOT NULL COMMENT '商品详情',
  sales_initial int(11) UNSIGNED NOT NULL DEFAULT '0' COMMENT '初始销量',
  sales_actual int(11) UNSIGNED NOT NULL DEFAULT '0' COMMENT '实际销量',
  goods_sort int(11) UNSIGNED NOT NULL DEFAULT '100' COMMENT '商品排序(数字越小越靠前)',
  goods_status tinyint(3) UNSIGNED NOT NULL DEFAULT '10' COMMENT '商品状态(10上架 20下架)',
  is_delete tinyint(3) UNSIGNED NOT NULL DEFAULT '0' COMMENT '是否删除',
  create_time int(11) UNSIGNED NOT NULL DEFAULT '0' COMMENT '创建时间',
  update_time int(11) UNSIGNED NOT NULL DEFAULT '0' COMMENT '更新时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品记录表';

商品分类表

CREATE TABLE `category` (
  `category_id` int(11) UNSIGNED NOT NULL COMMENT '商品分类id',
  `name` varchar(50) NOT NULL DEFAULT '' COMMENT '分类名称',
  `parent_id` int(11) UNSIGNED NOT NULL DEFAULT '0' COMMENT '上级分类id',
  `image_id` int(11) UNSIGNED NOT NULL DEFAULT '0' COMMENT '分类图片id',
  `sort` int(11) UNSIGNED NOT NULL DEFAULT '0' COMMENT '排序方式(数字越小越靠前)',
  `create_time` int(11) UNSIGNED NOT NULL DEFAULT '0' COMMENT '创建时间',
  `update_time` int(11) UNSIGNED NOT NULL DEFAULT '0' COMMENT '更新时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品分类表';

商品分类关联表

CREATE TABLE `category` (
  `category_id` int(11) UNSIGNED NOT NULL COMMENT '商品分类id',
  `goods_id` int(11) NOT NULL DEFAULT 0 COMMENT '商品id',
  `create_time` int(11) UNSIGNED NOT NULL DEFAULT '0' COMMENT '创建时间',
  `update_time` int(11) UNSIGNED NOT NULL DEFAULT '0' COMMENT '更新时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品分类关联表';

图片表

CREATE TABLE upload_file (
  file_id int(11) UNSIGNED NOT NULL COMMENT '文件id',
  storage varchar(20) NOT NULL DEFAULT '' COMMENT '存储方式',
  file_url varchar(255) NOT NULL DEFAULT '' COMMENT '存储域名',
  file_name varchar(255) NOT NULL DEFAULT '' COMMENT '文件路径',
  file_size int(11) UNSIGNED NOT NULL DEFAULT '0' COMMENT '文件大小(字节)',
  file_type varchar(20) NOT NULL DEFAULT '' COMMENT '文件类型',
  extension varchar(20) NOT NULL DEFAULT '' COMMENT '文件扩展名',
  is_user int(11) UNSIGNED NOT NULL DEFAULT '0' COMMENT '是否为c端用户上传',
  is_recycle tinyint(3) UNSIGNED NOT NULL DEFAULT '0' COMMENT '是否已回收',
  is_delete tinyint(3) UNSIGNED NOT NULL DEFAULT '0' COMMENT '软删除',
  create_time int(11) UNSIGNED NOT NULL DEFAULT '0' COMMENT '创建时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='图片记录表';

商品图片表

CREATE TABLE goods_image (
  id int(11) UNSIGNED NOT NULL COMMENT '主键id',
  goods_id int(11) UNSIGNED NOT NULL DEFAULT '0' COMMENT '商品id',
  image_id int(11) NOT NULL COMMENT '图片id(关联图片记录表)',
  create_time int(11) UNSIGNED NOT NULL DEFAULT '0' COMMENT '创建时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品图片记录表';

规格组表

CREATE TABLE spec (
  spec_id int(11) UNSIGNED NOT NULL COMMENT '规格组id',
  spec_name varchar(255) NOT NULL DEFAULT '' COMMENT '规格组名称',
  create_time int(11) NOT NULL COMMENT '创建时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品规格组记录表';

规格组值表

CREATE TABLE spec_value (
  spec_value_id int(11) UNSIGNED NOT NULL COMMENT '规格值id',
  spec_value varchar(255) NOT NULL COMMENT '规格值',
  spec_id int(11) NOT NULL COMMENT '规格组id',
  create_time int(11) NOT NULL COMMENT '创建时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品规格值记录表';

商品规格值关联表

CREATE TABLE goods_sku (
  goods_sku_id int(11) UNSIGNED NOT NULL COMMENT '商品规格id',
  goods_id int(11) UNSIGNED NOT NULL DEFAULT '0' COMMENT '商品id',
  spec_sku_id varchar(255) NOT NULL DEFAULT '0' COMMENT '商品sku记录索引 (由规格id组成)',
  image_id int(11) UNSIGNED NOT NULL DEFAULT '0' COMMENT '图片id',
  goods_no varchar(100) NOT NULL DEFAULT '' COMMENT '商品编码',
  goods_price decimal(10,2) UNSIGNED NOT NULL DEFAULT '0.00' COMMENT '商品价格',
  line_price decimal(10,2) UNSIGNED NOT NULL DEFAULT '0.00' COMMENT '商品划线价',
  stock_num int(11) UNSIGNED NOT NULL DEFAULT '0' COMMENT '当前库存数量',
  goods_sales int(11) UNSIGNED NOT NULL DEFAULT '0' COMMENT '商品销量',
  goods_weight double UNSIGNED NOT NULL DEFAULT '0' COMMENT '商品重量(Kg)',
  create_time int(11) UNSIGNED NOT NULL DEFAULT '0' COMMENT '创建时间',
  update_time int(11) UNSIGNED NOT NULL DEFAULT '0' COMMENT '更新时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品规格表';
本作品采用《CC 协议》,转载必须注明作者和本文链接
喜欢的,可以关注公众号"卡二条的技术圈"。
本帖由系统于 2个月前 自动加精
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 3

表的粒度过小,和性能怎么取舍那

2个月前 评论

商品表直接冗余一个catgory_id不行吗?请教弄个中间表用意如何?

商品隶属于多个分类?

2个月前 评论
奕鹏 (楼主) 1个月前

筛选+库存需要连多少表?

2个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!