新零售 多规格商品数据表设计

概述

本文覆盖商品规格管理、产品基础信息、商品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"]
        }
    ]
}

规则说明

  1. 单规格商品无需组装该数据,sku_list字段留空,is_have_spec标记为0;

  2. 规格值编号需与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. 单/多规格商品统一管理规则

  1. 无论是否为多规格商品,均需在product_sku表中创建对应记录;

  2. 单规格商品:product_spu.is_have_spec=0sku_list字段为空,product_sku表中仅一条关联记录;

  3. 多规格商品:product_spu.is_have_spec=1sku_list字段存储规格配置,product_sku表中每条记录对应一个规格组合。

2. 规格操作约束规则

  1. 新增规格(名/值):直接插入对应表(product_spec/product_spec_value),无需关联使用记录;

  2. 编辑规格(名/值):仅允许修改名称和排序,不允许修改唯一编号(spec_sn/spec_value_sn),避免关联数据失效;

  3. 删除规格(名/值):先查询spec_and_value_use_record表,若存在使用记录(关联商品),则禁止删除;无使用记录时,可执行逻辑删除。

3. 库存与上架关联规则

  1. 库存直接存储在product_sku.inventory字段,与仓库库存数据保持同步;

  2. inventory=0时,自动将product_sku.saleable设为0(下架);

  3. inventory>0product_spu.saleable=1时,product_sku.saleable设为1(上架);

  4. 前端展示时,仅显示saleable=1的SKU。

SQL文件获取

链接:https://pan.baidu.com/s/1mVlRSUjL1aRPmuUsO-6eXQ

提取码:n172