在电商系统中,商品表、商品规格表和单品库存表之间的ER关系通常围绕SPUSKU的概念来设计。下面是详细的解释:


一、SPU和SKU的概念及对应表

1. SPU(Standard Product Unit)

  • 定义:标准化产品单元,表示一组具有相同属性的商品集合。
  • 示例:iPhone 15(包含所有颜色、存储配置的统称)。
  • 对应表商品表(通常命名为 productspugoods)。

2. SKU(Stock Keeping Unit)

  • 定义:库存量单位,表示具体的单品,是库存管理和销售的最小单元。
  • 示例:iPhone 15 黑色 256GB(一个具体的可销售单品)。
  • 对应表单品库存表(通常命名为 skuitemproduct_sku)。

二、表结构及ER关系

表1:商品表(SPU表)

存储商品的基本信息(所有SKU共享)。

CREATE TABLE spu (
    id BIGINT PRIMARY KEY COMMENT 'SPU ID',
    name VARCHAR(200) COMMENT '商品名称(如iPhone 15)',
    category_id BIGINT COMMENT '分类ID',
    brand_id BIGINT COMMENT '品牌ID',
    description TEXT COMMENT '商品描述',
    status TINYINT COMMENT '状态',
    created_time DATETIME
);

表2:商品规格表

存储商品的规格属性(如颜色、存储容量)及其可选值

  • 通常分为两级:
    1. 规格键(如“颜色”、“存储容量”)。
    2. 规格值(如“黑色”、“256GB”)。
  • 用于定义SPU的规格模板。
-- 规格键表(spec_key)
CREATE TABLE spec_key (
    id BIGINT PRIMARY KEY,
    name VARCHAR(50) COMMENT '规格名称(如颜色)'
);

-- 规格值表(spec_value)
CREATE TABLE spec_value (
    id BIGINT PRIMARY KEY,
    spec_key_id BIGINT COMMENT '关联规格键',
    value VARCHAR(100) COMMENT '规格值(如黑色)'
);

-- SPU与规格的关联表(定义SPU有哪些规格)
CREATE TABLE spu_spec (
    spu_id BIGINT,
    spec_key_id BIGINT,
    PRIMARY KEY(spu_id, spec_key_id)
);

表3:单品库存表(SKU表)

存储具体单品的库存、价格、条形码等独有信息

CREATE TABLE sku (
    id BIGINT PRIMARY KEY COMMENT 'SKU ID',
    spu_id BIGINT COMMENT '关联的SPU',
    sku_code VARCHAR(50) UNIQUE COMMENT 'SKU编码(如IP15-BLK-256)',
    price DECIMAL(10,2) COMMENT '价格',
    stock INT COMMENT '库存',
    bar_code VARCHAR(100) COMMENT '条形码',
    status TINYINT COMMENT '状态',
    INDEX idx_spu_id(spu_id)
);

表4:SKU规格值关联表

记录每个SKU对应的具体规格值(如SKU A对应“颜色=黑色”、“存储=256GB”)。

CREATE TABLE sku_spec_value (
    sku_id BIGINT,
    spec_value_id BIGINT,
    PRIMARY KEY(sku_id, spec_value_id)
);

三、ER关系图(简化)

   ┌─────────────┐      1:n      ┌─────────────┐
   │     SPU     │───────────────│     SKU     │
   └─────────────┘               └─────────────┘
          │                              │
          │ m:n                         n:m
          │ (通过spu_spec)               │ (通过sku_spec_value)
          ▼                              ▼
   ┌─────────────┐               ┌─────────────┐
   │  规格键/值   │               │  规格值表   │
   └─────────────┘               └─────────────┘

关系说明

  1. SPU : SKU = 1 : n
    一个SPU(如iPhone 15)对应多个SKU(不同颜色、配置)。
  2. SPU : 规格键 = m : n
    一个SPU可以拥有多个规格(如颜色、存储),一个规格可用于多个SPU(如“颜色”规格也用于其他手机)。
  3. SKU : 规格值 = m : n
    一个SKU对应一组具体的规格值组合(如“黑色+256GB”),一个规格值可能被多个SKU使用(如“黑色”被多个SKU使用)。

四、查询示例

获取某个SPU下的所有SKU及其规格信息

SELECT 
    s.sku_code,
    s.price,
    s.stock,
    GROUP_CONCAT(CONCAT(k.name, ':', v.value)) AS specs
FROM sku s
JOIN sku_spec_value sv ON s.id = sv.sku_id
JOIN spec_value v ON sv.spec_value_id = v.id
JOIN spec_key k ON v.spec_key_id = k.id
WHERE s.spu_id = 123
GROUP BY s.id;

总结

  • SPU表:商品公共信息(如iPhone 15)。
  • SKU表:具体单品信息(如iPhone 15黑色256GB的库存和价格)。
  • 规格表:定义商品的属性体系(如颜色、存储),并通过关联表绑定到SPU和SKU。

这种设计实现了商品信息的标准化管理灵活的规格扩展,是电商系统的核心数据模型之一。

简化的三U表设计ER关系图

简化的三U表设计ER关系图

一、核心三表ER关系

┌─────────────────────────────────────────────────────────────┐
│                     电商商品核心ER关系                        │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│   ┌─────────────────┐       1:n       ┌─────────────────┐  │
│   │   商品表(SPU)    │◄─────────────── │   SKU表(SKU)    │  │
│   └─────────────────┘                 └─────────────────┘  │
│         │                                                      │
│         │ 1:n                                                   │
│         ▼                                                      │
│   ┌─────────────────┐                                        │
│   │  商品规格表      │                                        │
│   └─────────────────┘                                        │
│                                                              │
└─────────────────────────────────────────────────────────────┘

二、详细字段级ER图

一个商品有多个规格

一个商品有多个SKU

SKU属于一个商品

规格属于一个商品

PRODUCT

bigint

id

PK

商品ID(SPU ID)

varchar

name

商品名称

bigint

category_id

分类ID

varchar

main_image

主图URL

text

description

商品描述

tinyint

status

状态

timestamp

created_at

timestamp

updated_at

PRODUCT_SPEC

bigint

id

PK

规格ID

bigint

product_id

FK

商品ID

varchar

spec_name

规格名称

varchar

spec_value

规格值

int

display_order

显示顺序

PRODUCT_SKU

bigint

id

PK

SKU ID

bigint

product_id

FK

商品ID

varchar

sku_code

SKU编码

varchar

spec_combination

规格组合

decimal

price

价格

decimal

original_price

原价

int

stock

库存

int

stock_warning

库存预警

varchar

bar_code

条形码

decimal

weight

重量

tinyint

status

状态

timestamp

created_at

timestamp

updated_at

三、实体关系详解

1. 商品表(SPU)

PRODUCT (实体)
├── 主键: id (SPU标识)
├── 属性: name, category_id, description等
├── 关系: 一对多(PRODUCT_SPEC, PRODUCT_SKU)
└── 说明: 代表标准化产品单元

2. SKU表

PRODUCT_SKU (实体)
├── 主键: id (SKU标识)
├── 外键: product_id (引用PRODUCT.id)
├── 属性: sku_code, price, stock等
├── 核心字段: spec_combination (规格组合字符串)
└── 说明: 代表具体可销售的最小库存单元

3. 商品规格表

PRODUCT_SPEC (实体)
├── 主键: id
├── 外键: product_id (引用PRODUCT.id)
├── 属性: spec_name, spec_value
└── 说明: 存储商品的所有规格选项

四、关系逻辑说明

关系流向

SPU(商品) → 定义 → 规格选项(颜色、尺寸等)
    ↓
    ↓ 组合
    ↓
SKU(单品) = SPU + 规格组合 + 独立属性(价格、库存)

数据示例

SPU: iPhone 15
│
├── 规格: [颜色:黑色,白色,蓝色], [存储:128G,256G,512G]
│
└── SKU:
    ├── SKU1: iPhone 15 (黑色,128G) ¥5999 库存100
    ├── SKU2: iPhone 15 (黑色,256G) ¥6999 库存80
    ├── SKU3: iPhone 15 (白色,128G) ¥5999 库存120
    └── SKU4: iPhone 15 (蓝色,512G) ¥8999 库存50

五、查询关系路径

1. SPU到SKU的查询

SELECT p.name, s.sku_code, s.spec_combination, s.price, s.stock
FROM product p
JOIN product_sku s ON p.id = s.product_id
WHERE p.id = 123;

2. SPU到规格的查询

SELECT p.name, ps.spec_name, ps.spec_value
FROM product p
JOIN product_spec ps ON p.id = ps.product_id
WHERE p.id = 123
ORDER BY ps.spec_name, ps.display_order;

3. SKU到规格的解析

-- 查询SKU,同时获取其对应的规格信息(通过解析spec_combination)
SELECT 
    s.sku_code,
    s.spec_combination,
    -- 这里需要业务逻辑解析spec_combination字符串
    -- 如"黑色,256GB" -> 解析为规格值
FROM product_sku s
WHERE s.product_id = 123;

六、ER关系特点总结

层级结构

第一层: PRODUCT (SPU) - 商品总体信息
    第二层: PRODUCT_SPEC - 商品规格定义
    第二层: PRODUCT_SKU - 商品具体单品

数据依赖

  • PRODUCT_SPEC 完全依赖 PRODUCT (通过product_id)
  • PRODUCT_SKU 完全依赖 PRODUCT (通过product_id)
  • PRODUCT_SPECPRODUCT_SKU 之间没有直接外键关系
  • PRODUCT_SKU.spec_combination 逻辑上关联 PRODUCT_SPEC.spec_value

设计优势

  1. 简化关联:只有两层关系,查询路径清晰
  2. 易于维护:新增规格只需插入记录,无需修改表结构
  3. 性能优化:减少了JOIN操作,SKU查询效率高
  4. 灵活性:规格组合通过字符串存储,支持任意规格组合

七、可视化ER图(ASCII版)

          ┌─────────────────────┐
          │    PRODUCT (SPU)    │
          │  id (PK)            │
          │  name               │
          │  category_id        │
          │  ...                │
          └──────────┬──────────┘
                     │
          ┌──────────┼──────────┐
          │          │          │
          ▼          ▼          ▼
┌─────────────────┐  │  ┌─────────────────┐
│ PRODUCT_SPEC    │  │  │ PRODUCT_SKU     │
│ id (PK)         │  │  │ id (PK)         │
│ product_id (FK) │  │  │ product_id (FK) │
│ spec_name       │  │  │ sku_code        │
│ spec_value      │  │  │ spec_combination│
│ display_order   │  │  │ price           │
└─────────────────┘  │  │ stock           │
                     │  │ ...             │
                     │  └─────────────────┘
                     │
                     │ 逻辑关联:spec_combination
                     │ 存储规格值组合字符串
                     │ (如"黑色,256GB")
                     ▼
            ┌─────────────────┐
            │ 业务逻辑层解析   │
            │ spec_combination│
            │ 匹配规格值       │
            └─────────────────┘

八、扩展关系(可选)

如果需要更严格的规格约束,可以添加第四张表:

-- SKU规格关联表(建立SKU与规格值的直接关联)
CREATE TABLE sku_spec (
    sku_id BIGINT,
    spec_id BIGINT,  -- 引用product_spec.id
    PRIMARY KEY(sku_id, spec_id)
);

这样ER关系变为:

PRODUCT(SPU) → PRODUCT_SPEC → SKU_SPEC ← PRODUCT_SKU(SKU)

但这种设计会增加复杂度,在简化三表设计中通常不采用。

总结

简化的三表ER设计以PRODUCT(SPU)为核心,通过一对多关系连接PRODUCT_SPECPRODUCT_SKU(SKU),形成了清晰的两级结构,适合大多数中小型电商系统的需求。

Logo

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

更多推荐