概述
本文覆盖商品规格管理、产品基础信息、商品SKU详情及使用记录追溯全流程,支持单规格与多规格商品统一管理,适配后台商品运营与前端展示需求。
核心数据表设计
1. 规格类目表(product_spec_group)
功能定位
用于后台归类管理商品规格维度(如“尺寸”“颜色”“材质”等类目),为规格名提供归属分类。
表结构
DROP TABLE IF EXISTS `product_spec_group`;
CREATE TABLE `product_spec_group` (
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`spec_group_sn` int(10) UNSIGNED NOT NULL COMMENT '规格类目唯一编号(快速识别类目)',
`spec_group_name` varchar(200) NOT NULL COMMENT '规格类目名称(如:尺寸、颜色)',
`is_delete` tinyint(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除:0-未删除,1-已删除',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `unq_spg_sn`(`spec_group_sn`) USING BTREE COMMENT '唯一索引,避免编号重复',
UNIQUE INDEX `unq_name`(`spec_group_name`) USING BTREE COMMENT '唯一索引,避免类目名称重复'
) ENGINE = InnoDB CHARACTER SET = utf8 COMMENT = '规格类目表,用于后台商品规格维度归类';
2. 规格名表(product_spec)
功能定位
存储具体规格维度下的名称(如“尺寸”类目下的“码数”“长度”),关联所属规格类目。
表结构
DROP TABLE IF EXISTS `product_spec`;
CREATE TABLE `product_spec` (
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`spec_sn` int(10) UNSIGNED NOT NULL COMMENT '规格名唯一编号',
`spec_group_sn` int(10) UNSIGNED NOT NULL COMMENT '所属规格类目编号(关联product_spec_group.spec_group_sn)',
`spec_name` varchar(200) NOT NULL COMMENT '规格名称(如:码数、颜色)',
`sort` mediumint(8) unsigned NOT NULL DEFAULT '0' COMMENT '排序权重(数值越大越靠前)',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `unq_spc_sn`(`spec_sn`) USING BTREE COMMENT '唯一索引,避免规格名编号重复',
INDEX `idx_spg_sn`(`spec_group_sn`) USING BTREE COMMENT '关联类目索引,提升查询效率'
) ENGINE = InnoDB CHARACTER SET = utf8 COMMENT = '商品规格名表,关联规格类目';
3. 规格值表(product_spec_value)
功能定位
存储规格名对应的具体可选值(如“码数”下的“L”“XL”),关联所属规格名。
表结构
DROP TABLE IF EXISTS `product_spec_value`;
CREATE TABLE `product_spec_value` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`spec_sn` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '规格名唯一编号(关联product_spec.spec_sn)',
`spec_value_sn` varchar(128) NOT NULL COMMENT '规格值唯一编号',
`spec_value_name` varchar(640) NOT NULL DEFAULT '' COMMENT '规格值名称(如:L、红色、纯棉)',
`sort` mediumint(8) unsigned NOT NULL DEFAULT '0' COMMENT '排序权重(数值越大越靠前)',
UNIQUE INDEX `unq_spv_sn`(`spec_value_sn`) USING BTREE COMMENT '唯一索引,避免规格值编号重复',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_spec_sn`(`spec_sn`) USING BTREE COMMENT '关联规格名索引,提升查询效率'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品规格值表,关联规格名';
4. 产品表(product_spu)
功能定位
存储商品基础信息(如手机、服装等产品级信息),关联分类、品牌及规格类目,标记是否为多规格商品。
表结构
DROP TABLE IF EXISTS `product_spu`;
CREATE TABLE `product_spu` (
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '产品主键ID',
`title` varchar(200) NOT NULL COMMENT '产品标题(如:XX品牌2024新款休闲T恤)',
`sub_title` varchar(200) NULL DEFAULT NULL COMMENT '产品副标题(如:透气面料/多色可选)',
`category_id` int(10) UNSIGNED NOT NULL COMMENT '分类ID(关联product_category.id)',
`brand_id` int(10) UNSIGNED NULL DEFAULT NULL COMMENT '品牌ID(关联product_brand.id,可为空)',
`spec_group_sn` int(10) UNSIGNED NOT NULL COMMENT '规格类目编号(关联product_spec_group.spec_group_sn)',
`spu_image` varchar(256) NOT NULL COMMENT '商品列表展示图(主图)',
`is_have_spec` TINYINT(1) NOT NULL COMMENT '是否多规格商品:0-单规格,1-多规格',
`sku_list` VARCHAR(256) NOT NULL DEFAULT '' COMMENT '多规格SKU配置JSON(格式见下文,单规格为空)',
`saleable` tinyint(1) NOT NULL COMMENT '是否上架:0-下架,1-上架',
`is_valid` tinyint(1) NOT NULL COMMENT '是否有效:0-无效,1-有效',
`create_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间(自动填充)',
`update_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间(自动更新)',
`is_delete` tinyint(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除:0-未删除,1-已删除',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_brand_id`(`brand_id`) USING BTREE COMMENT '品牌索引,提升品牌筛选效率',
INDEX `idx_category_id`(`category_id`) USING BTREE COMMENT '分类索引,提升分类筛选效率',
INDEX `idx_spg_sn`(`spec_group_sn`) USING BTREE COMMENT '规格类目索引,关联规格查询',
INDEX `idx_saleable`(`saleable`) USING BTREE COMMENT '上架状态索引,提升商品列表查询效率',
INDEX `idx_valid`(`is_valid`) USING BTREE COMMENT '有效性索引,过滤无效商品'
) ENGINE = InnoDB CHARACTER SET = utf8 COMMENT = '产品基础信息表(SPU级)';
5. 商品表(product_sku)
功能定位
存储最小销售单位信息(如“红色-L码T恤”),关联所属产品,记录价格、库存、规格组合等核心交易信息。
表结构
DROP TABLE IF EXISTS `product_sku`;
CREATE TABLE `product_sku` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '商品主键ID(SKU级)',
`spu_id` INT(10) UNSIGNED NOT NULL COMMENT '所属产品ID(关联product_spu.id)',
`title` VARCHAR(200) NOT NULL COMMENT '商品标题(含规格,如:XXT恤-红色-L码)',
`images` JSON NULL COMMENT '商品详情图片集(JSON格式,如:["url1","url2"])',
`price` DECIMAL(10, 2) UNSIGNED NOT NULL COMMENT '销售价格(保留2位小数)',
`spec_sn_combination` varchar(128) NOT NULL DEFAULT '' COMMENT '规格值编号组合(如:10001_10005,关联product_spec_value.spec_value_sn)',
`inventory` INT(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '库存数量(新增字段,关联仓库库存)',
`saleable` Tinyint(1) NOT NULL COMMENT '是否上架:0-下架,1-上架',
`valid` Tinyint(1) NOT NULL COMMENT '是否有效:0-无效,1-有效',
`create_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间(自动填充)',
`update_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间(自动更新)',
`is_deleted` Tinyint(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除:0-未删除,1-已删除',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_spu_id`(`spu_id`) USING BTREE COMMENT '关联产品索引,提升SKU查询效率',
INDEX `idx_saleable`(`saleable`) USING BTREE COMMENT '上架状态索引',
INDEX `idx_valid`(`valid`) USING BTREE COMMENT '有效性索引',
INDEX `idx_spec_combination`(`spec_sn_combination`) USING BTREE COMMENT '规格组合索引,快速匹配规格',
FULLTEXT INDEX `title`(`title`) COMMENT '标题全文索引,支持关键词搜索'
) ENGINE = InnoDB CHARACTER SET = utf8 COMMENT = '商品详情表(SKU级)';
6.规格及规格值使用记录表(spec_and_value_use_record)
功能定位
冗余维护规格名与规格值的使用状态,防止删除正在被商品使用的规格(名/值),保障数据一致性。
表结构
DROP TABLE IF EXISTS `spec_and_value_use_record`;
CREATE TABLE `spec_and_value_use_record` (
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID(新增,原设计以spu_id为主键不合理)',
`spu_id` int(10) UNSIGNED NOT NULL COMMENT '产品ID(关联product_spu.id)',
`spec_sn` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '规格名唯一编号(关联product_spec.spec_sn)',
`spec_value_sn` varchar(128) NOT NULL DEFAULT '' COMMENT '规格值唯一编号(关联product_spec_value.spec_value_sn)',
`record_type` tinyint(1) NOT NULL DEFAULT '1' COMMENT '记录类型:1-规格名,2-规格值',
`create_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `unq_spu_spec_value`(`spu_id`, `spec_sn`, `spec_value_sn`, `record_type`) USING BTREE COMMENT '联合唯一索引,避免重复记录',
INDEX `idx_spec_sn`(`spec_sn`) USING BTREE COMMENT '规格名索引,查询使用状态',
INDEX `idx_spec_value_sn`(`spec_value_sn`) USING BTREE COMMENT '规格值索引,查询使用状态'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='规格及规格值使用记录表(防误删)';
数据交互规范
1.后台商品操作数据格式(存储到product_spu.sku_list)
多规格商品需按以下JSON格式组装数据,存储到product_spu表的sku_list字段,用于前端展示规格选项:
{
"sku_list": [
{
"spec_sn": "100", // 规格名编号(product_spec.spec_sn)
"spec_value_sn_list": ["10001", "10002"] // 该规格下可选规格值编号(product_spec_value.spec_value_sn)
},
{
"spec_sn": "101",
"spec_value_sn_list": ["10005", "10006"]
}
]
}
规则说明
-
单规格商品无需组装该数据,
sku_list字段留空,is_have_spec标记为0; -
规格值编号需与
product_spec_value表中对应值一致,确保关联有效性。
2. 前端商品详情接口返回格式
1. 单规格商品
{
"is_have_spec": 0, // 0-单规格
"sku_sn": "100030", // 商品SKU编号(product_sku.id)
"title": "XX品牌基础款T恤-白色-M码", // 商品标题(含规格)
"images": ["https://example.com/img1.jpg", "https://example.com/img2.jpg"], // 商品图片集
"price": 140.00, // 销售价格
"inventory": 19, // 库存数量
"saleable": 1 // 是否上架:1-是,0-否
}
2. 多规格商品
{
"is_have_spec": 1, // 1-多规格
"spu_title": "XX品牌2024新款休闲T恤", // 产品标题(product_spu.title)
"spu_image": "https://example.com/spu-img.jpg", // 产品列表图(product_spu.spu_image)
"spec_list": [ // 规格及可选值列表
{
"spec_name": "码数", // 规格名(product_spec.spec_name)
"spec_value_list": [
{
"spec_value_sn": "10001", // 规格值编号
"spec_value": "L", // 规格值名称
"sort": 1 // 排序权重
},
{
"spec_value_sn": "10002",
"spec_value": "XL",
"sort": 2
}
]
},
{
"spec_name": "颜色",
"spec_value_list": [
{
"spec_value_sn": "10005",
"spec_value": "绿色",
"sort": 1
},
{
"spec_value_sn": "10006",
"spec_value": "紫色",
"sort": 5
}
]
}
],
"sku_list": [ // 所有规格组合对应的SKU信息
{
"sku_sn": "iphone_12_001", // SKU编号
"spec_value_sn_combination": ["10001", "10005"], // 规格值编号组合
"spec_combination_desc": "L码-绿色", // 规格组合描述(新增,便于前端展示)
"price": 13000.00,
"inventory": 23,
"saleable": 1
},
{
"sku_sn": "iphone_12_002",
"spec_value_sn_combination": ["10001", "10006"],
"spec_combination_desc": "L码-紫色",
"price": 14000.00,
"inventory": 66,
"saleable": 1
},
{
"sku_sn": "iphone_12_003",
"spec_value_sn_combination": ["10002", "10005"],
"spec_combination_desc": "XL码-绿色",
"price": 13500.00,
"inventory": 11,
"saleable": 1
},
{
"sku_sn": "iphone_12_004",
"spec_value_sn_combination": ["10002", "10006"],
"spec_combination_desc": "XL码-紫色",
"price": 6666.00,
"inventory": 0,
"saleable": 0 // 库存为0时自动下架
}
]
}
核心业务规则
1. 单/多规格商品统一管理规则
-
无论是否为多规格商品,均需在
product_sku表中创建对应记录; -
单规格商品:
product_spu.is_have_spec=0,sku_list字段为空,product_sku表中仅一条关联记录; -
多规格商品:
product_spu.is_have_spec=1,sku_list字段存储规格配置,product_sku表中每条记录对应一个规格组合。
2. 规格操作约束规则
-
新增规格(名/值):直接插入对应表(
product_spec/product_spec_value),无需关联使用记录; -
编辑规格(名/值):仅允许修改名称和排序,不允许修改唯一编号(
spec_sn/spec_value_sn),避免关联数据失效; -
删除规格(名/值):先查询
spec_and_value_use_record表,若存在使用记录(关联商品),则禁止删除;无使用记录时,可执行逻辑删除。
3. 库存与上架关联规则
-
库存直接存储在
product_sku.inventory字段,与仓库库存数据保持同步; -
当
inventory=0时,自动将product_sku.saleable设为0(下架); -
当
inventory>0且product_spu.saleable=1时,product_sku.saleable设为1(上架); -
前端展示时,仅显示
saleable=1的SKU。
SQL文件获取
链接:https://pan.baidu.com/s/1mVlRSUjL1aRPmuUsO-6eXQ
提取码:n172


