SPU、SKU、商品属性数据库标准设计方案

本文方案适配电商、零售、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 范式结构
相关推荐
sir56565567 天前
做跨境电商怎么保存亚马逊上面的商品图到电脑上
教育电商·电商
Jabes.yang8 天前
Java电商订单系统面试全流程解析:接口设计、数据库、微服务与分布式事务实战
java·微服务·mybatis·分布式事务·电商·订单系统·接口设计
吕永强21 天前
基于SpringBoot+Vue农产品销售与管理系统(源码+论文+部署)
毕业设计·商城·毕业论文·电商·农产品·农产品商城·农产品销售与管理系统
小蒋聊技术1 个月前
电商系列第七课:售后与物流中心 —— 服务质量提升与智能物流路由
架构·系统架构·电商
TAOCARTS0011 个月前
从月入 3000 到月入 3 万,我做对了什么
跨境电商·电商
TAOCARTS0011 个月前
东南亚跨境电商爆发式增长,中国卖家如何抢占先机
跨境电商·电商
聊点儿技术2 个月前
LLM数据采集如何突破AI反爬?——用IP数据接口实现进阶
人工智能·数据分析·产品运营·ip·电商·ip地址查询·ip数据接口
仙草不加料2 个月前
互联网大厂Java面试故事实录:三轮场景化技术提问与详细答案解析
java·spring boot·微服务·面试·aigc·电商·内容社区