本文针对电商系统中的商品管理模块进行分析,总结出如何设计一个合理的商品管理表。分析的角度,重点放在商品的规格设计上,针对单一规格、多规格和组合规格情况进行如何设计表的总结。
前期分析
对于商品功能,我这里总结了至少需要下面这几张表。
表名 表作用 常用字段
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,库存,销量,编码,重量等信息
单一个规格设计
什么是单一规格,所谓的单一规格就是默认只有一种规格。当用户选择商品下单时,不需要去选择什么规格,直接默认一种商品属性。例如下面的截图示例:
对应的逻辑关系如下图:
管理端截图:
多种规格设计
什么是多种规格,多种规格就是指不包含一种规格,例如一个商品中有颜色、重量、大小等等规格,这种不同的规格又有不同的值。
多种规格的表该如何设计呢?其实和上面的逻辑关系是一样的,无非就是一种规格多种值时,添加多条记录而已。
表设计总结
商品记录表#
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='商品规格表';