本文方案适配电商、零售、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 范式结构
所有评论(0)