本文方案适配电商、零售、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 范式结构