本文方案适配电商、零售、Robotaxi 车载配件、商城售卖等场景,分标准版(中小业务)高性能分表版(大流量平台),拆解 SPU/SKU/ 属性 / 规格逻辑,附带建表 SQL 与业务说明。

一、基础概念厘清

      1. SPU(标准化产品单元)
       一款商品主体,不区分颜色、尺寸、配置;如:iPhone 15、享道车载防护罩、小米 14 手机。
       承载公共信息:标题、封面图、分类、品牌、详情介绍、质保、服务标签。

       2. SKU(库存保有单位)
         SPU 下每一个可下单、有独立库存价格的最小售卖单元;
         例:iPhone15 128G 黑色 /iPhone15 256G 白色;防护罩标准版 / 加固版。

       3.属性二分:公共属性 + 销售规格属性

  • 公共属性:整款 SPU 通用,所有 SKU 都一样(材质、产地、适配车型、净重)
  • 销售规格:区分 SKU 的维度(颜色、内存、尺寸、配置版本)

二、五张核心表标准设计(通用稳定架构)

1. 商品品牌表 goods_brand

sql
CREATE TABLE goods_brand (
    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '品牌ID',
    brand_name VARCHAR(100) NOT NULL COMMENT '品牌名称',
    brand_logo VARCHAR(255) COMMENT 'logo地址',
    sort INT DEFAULT 0 COMMENT '排序',
    status TINYINT DEFAULT 1 COMMENT '0禁用1启用',
    create_time DATETIME DEFAULT NOW(),
    update_time DATETIME DEFAULT NOW() ON UPDATE NOW()
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品品牌';

2. 商品分类表 goods_category(多级树形)

sql
CREATE TABLE goods_category (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    parent_id BIGINT DEFAULT 0 COMMENT '父分类,0顶级',
    category_name VARCHAR(100) NOT NULL,
    level TINYINT NOT NULL COMMENT '层级1/2/3',
    sort INT DEFAULT 0,
    status TINYINT DEFAULT 1,
    create_time DATETIME DEFAULT NOW(),
    update_time DATETIME DEFAULT NOW() ON UPDATE NOW()
) COMMENT '商品三级分类';

3. SPU 主表 goods_spu(商品主体)

核心:存所有 SKU 共享的全局信息

sql
CREATE TABLE goods_spu (
    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT 'SPU主键',
    spu_name VARCHAR(255) NOT NULL COMMENT '商品标题',
    brand_id BIGINT NOT NULL COMMENT '关联品牌',
    category_id BIGINT NOT NULL COMMENT '三级分类ID',
    cover_img VARCHAR(255) NOT NULL COMMENT '首图封面',
    banner_imgs TEXT COMMENT '轮播图,逗号分隔',
    spu_desc TEXT COMMENT '富文本详情介绍',
    unit VARCHAR(20) COMMENT '单位:件/套/台',
    market_price DECIMAL(10,2) COMMENT '划线原价',
    sales_min_price DECIMAL(10,2) COMMENT '所有SKU最低售价',
    sales_volume BIGINT DEFAULT 0 COMMENT '总销量',
    total_stock INT DEFAULT 0 COMMENT '汇总库存',
    service_tags VARCHAR(500) COMMENT '售后标签:七天无理由|质保一年',
    spec_type TINYINT NOT NULL COMMENT '0无规格单SKU 1多规格多SKU',
    status TINYINT DEFAULT 0 COMMENT '0下架 1上架 2草稿',
    create_time DATETIME DEFAULT NOW(),
    update_time DATETIME DEFAULT NOW() ON UPDATE NOW(),
    KEY idx_brand (brand_id),
    KEY idx_category (category_id),
    KEY idx_status (status)
) COMMENT='SPU商品主表';

4. SKU 表 goods_sku(最小售卖单元)

一个 SPU 对应 N 个 SKU,独立价格、库存、编码、条码

sql
CREATE TABLE goods_sku (
    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT 'SKU主键',
    spu_id BIGINT NOT NULL COMMENT '归属SPU',
    sku_name VARCHAR(255) NOT NULL COMMENT '规格全名:iPhone15-128G-黑色',
    spec_value_ids VARCHAR(500) NOT NULL COMMENT '关联规格值ID集合,逗号分隔',
    sku_code VARCHAR(64) UNIQUE COMMENT '商家自定义编码',
    bar_code VARCHAR(64) COMMENT '商品条码',
    price DECIMAL(10,2) NOT NULL COMMENT '售卖价',
    stock INT NOT NULL DEFAULT 0 COMMENT '可用库存',
    lock_stock INT DEFAULT 0 COMMENT '已锁定未支付库存',
    weight DECIMAL(8,2) COMMENT '重量g',
    sku_img VARCHAR(255) COMMENT '规格单独图片(颜色图等)',
    status TINYINT DEFAULT 1 COMMENT '0失效1正常',
    create_time DATETIME DEFAULT NOW(),
    update_time DATETIME DEFAULT NOW() ON UPDATE NOW(),
    KEY idx_spu (spu_id),
    KEY idx_code (sku_code)
) COMMENT='SKU库存规格表';

5. 规格维度表 + 规格值表(拆分两张,灵活扩展)

5.1 规格维度 spec_key(如:颜色、内存、配置版本、尺寸)

sql
CREATE TABLE spec_key (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    spu_id BIGINT NOT NULL COMMENT '绑定哪个SPU的规格模板',
    key_name VARCHAR(50) NOT NULL COMMENT '规格名:颜色/内存/尺寸',
    sort INT DEFAULT 0,
    create_time DATETIME DEFAULT NOW(),
    KEY idx_spu (spu_id)
) COMMENT='规格维度键';

5.2 规格可选项 spec_value(黑色、白色、128G、256G)

sql
CREATE TABLE spec_value (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    spec_key_id BIGINT NOT NULL COMMENT '归属规格维度',
    value_name VARCHAR(50) NOT NULL COMMENT '规格值:黑色',
    value_img VARCHAR(255) COMMENT '规格图片',
    sort INT DEFAULT 0,
    create_time DATETIME DEFAULT NOW(),
    KEY idx_spec_key (spec_key_id)
) COMMENT='规格可选值';

6. 通用商品属性表 goods_spu_attr(公共参数)

存储 SPU 统一参数:材质、适配车型、功率、产地、尺寸参数等

sql
CREATE TABLE goods_spu_attr (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    spu_id BIGINT NOT NULL,
    attr_name VARCHAR(100) NOT NULL COMMENT '参数名:适配车型',
    attr_value VARCHAR(500) NOT NULL COMMENT '参数值:享道Robotaxi E7',
    sort INT DEFAULT 0,
    KEY idx_spu (spu_id)
) COMMENT='SPU公共属性参数';

三、表关联关系梳理

  • 1 品牌 → N SPU
  • 1 分类 → N SPU
  • 1 SPU → N SKU
  • 1 SPU → N spec_key(规格维度)
  • 1 spec_key → N spec_value(可选值)
  • 1 SPU → N spu_attr(公共参数)
  • SKU 通过spec_value_ids字符串绑定多个规格值 ID,拼接组成唯一规格组合

示例数据演示

SPU:iPhone 15
spec_key1:内存 → spec_value:128G、256G
spec_key2:颜色 → spec_value:黑色、白色
SKU1:spu_id=1,spec_value_ids="1,3" → 128G 黑色
SKU2:spu_id=1,spec_value_ids="2,3" →256G 黑色

四、两种业务场景优化方案

方案 A:轻量小商城(上面 6 张表直接用,无冗余)

优点:结构清晰、易维护、新增规格不用改表;
缺点:SKU 规格组合查询需要拆分字符串,少量 CPU 消耗,中小流量完全无压力。

方案 B:高并发大型平台(优化关联,弃用逗号字符串)

新增中间关联表 sku_spec_rel 替代 SKU 里的 spec_value_ids,完全标准范式,适合千万级商品:

sql
CREATE TABLE sku_spec_rel (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    sku_id BIGINT NOT NULL,
    spec_value_id BIGINT NOT NULL,
    UNIQUE uk_sku_spec (sku_id,spec_value_id),
    KEY idx_sku (sku_id)
) COMMENT='SKU与规格值多对多中间表';

优势:

  • 可 SQL 联表精准筛选:查所有黑色256G SKU
  • 支持索引、分页、复杂筛选;
  • 避免字符串拆分,查询性能大幅提升;
  • 适合:电商平台、库存系统、需要规格筛选搜索的场景。

五、避坑设计要点

  • 不要把规格塞 JSON 存在 SPU/SKU 字段
    早期省事存 JSON,后期筛选、统计、库存同步、检索无法走 SQL 索引,大数据量必重构。
  • 区分「公共属性」和「销售规格」
    公共属性放 spu_attr,全 SPU 统一;区分 SKU 的才走 spec_key/spec_value,不要混为一张表。
  • 单规格商品简化兼容
    spec_type=0 时,只生成一条 SKU,无需录入规格键值,前端自动适配无规格 UI。
  • 库存一定要分可用 + 锁定
    防止超卖:下单扣 lock_stock,支付成功转移至真实扣减 stock,取消订单释放 lock。
  • 价格统一收敛到 SKU
    SPU 只存最低展示价,真实结算以 sku.price 为准,避免价格不一致。
  • 图片分层:SPU 轮播图、SKU 单独规格图、规格值色卡图,各司其职。

六、扩展能力(可按需叠加)

  • 商品图片表:单独一张 goods_image,SPU/SKU 多图统一管理;
  • 价格阶梯表:sku_price_ladder,批量采购阶梯价;
  • 优惠券、活动绑定 SPU 维度;
  • 库存分仓:sku_warehouse_stock,多仓库独立库存;
  • ES 同步:SPU、规格、属性全量同步搜索引擎,用于前台商品检索。

极简选型建议

  • 内部商城、配件售卖、小型后台:用六表标准版(逗号分隔 spec_value_ids)
  • 面向 C 端大流量电商、多筛选搜索:升级加多对多中间表 sku_spec_rel 范式结构

Logo

电商企业物流数字化转型必备!快递鸟 API 接口,72 小时快速完成物流系统集成。全流程实战1V1指导,营造开放的API技术生态圈。

更多推荐