电商系统中商品表、商品规格表、单品库存表 之间的er关系;spu和sku分别指的是那张表
·
在电商系统中,商品表、商品规格表和单品库存表之间的ER关系通常围绕SPU和SKU的概念来设计。下面是详细的解释:
一、SPU和SKU的概念及对应表
1. SPU(Standard Product Unit)
- 定义:标准化产品单元,表示一组具有相同属性的商品集合。
- 示例:iPhone 15(包含所有颜色、存储配置的统称)。
- 对应表:商品表(通常命名为
product、spu或goods)。
2. SKU(Stock Keeping Unit)
- 定义:库存量单位,表示具体的单品,是库存管理和销售的最小单元。
- 示例:iPhone 15 黑色 256GB(一个具体的可销售单品)。
- 对应表:单品库存表(通常命名为
sku、item或product_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:商品规格表
存储商品的规格属性(如颜色、存储容量)及其可选值。
- 通常分为两级:
- 规格键(如“颜色”、“存储容量”)。
- 规格值(如“黑色”、“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)
▼ ▼
┌─────────────┐ ┌─────────────┐
│ 规格键/值 │ │ 规格值表 │
└─────────────┘ └─────────────┘
关系说明:
- SPU : SKU = 1 : n
一个SPU(如iPhone 15)对应多个SKU(不同颜色、配置)。 - SPU : 规格键 = m : n
一个SPU可以拥有多个规格(如颜色、存储),一个规格可用于多个SPU(如“颜色”规格也用于其他手机)。 - 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图
三、实体关系详解
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_SPEC 和 PRODUCT_SKU 之间没有直接外键关系
- PRODUCT_SKU.spec_combination 逻辑上关联 PRODUCT_SPEC.spec_value
设计优势
- 简化关联:只有两层关系,查询路径清晰
- 易于维护:新增规格只需插入记录,无需修改表结构
- 性能优化:减少了JOIN操作,SKU查询效率高
- 灵活性:规格组合通过字符串存储,支持任意规格组合
七、可视化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_SPEC和PRODUCT_SKU(SKU),形成了清晰的两级结构,适合大多数中小型电商系统的需求。
更多推荐



所有评论(0)