返回架构笔记
Arch Day 67

Arch Day 67: 商品中心设计

商品中心是电商/零售系统的数据基石,通过SPU(标准化产品单元)、SKU(库存量单位)、属性体系、类目体系和价格体系的组合设计,实现"一个商品从创建到展示到交易"全生命周期的结构化管理。

2026-06-05
第三阶段 - 零售域深度
商品中心SPUSKU类目体系价格体系DDD

日期: 2026-06-05 (Day 67) 阶段: 第三阶段 - 零售域深度 标签: #商品中心 #SPU #SKU #类目体系 #价格体系 #DDD


核心概念

一句话定义

商品中心是电商/零售系统的数据基石,通过SPU(标准化产品单元)、SKU(库存量单位)、属性体系、类目体系和价格体系的组合设计,实现"一个商品从创建到展示到交易"全生命周期的结构化管理。

为什么关注

  • 基石系统:所有零售业务(搜索/展示/下单/库存/物流)都依赖商品数据
  • 设计复杂度高:全品类商品中心的属性/SKU管理是数据模型设计的经典挑战
  • 面试高频:SPU/SKU关系、属性模板设计是系统设计面试的常见题目
  • AI革新:AIGC正在重塑商品内容生产(描述/图片/视频自动生成)
  • 规模挑战:头部电商平台管理数十亿SKU,性能和效率是核心

误区与反模式

误区现实
SPU就是商品SPU是标准化产品单元,一个SPU可以有多个SKU(不同颜色/尺码)
SKU越多越好SKU爆炸导致管理成本飙升,需要精细化管控
属性随便加属性管理不当导致数据混乱(同义属性/格式不统一)
一套类目打天下前台类目(用户浏览)和后台类目(管理分类)必须分离
价格就一个字段基础价/促销价/渠道价/会员价/区域价需要独立管理

知识点详解

1. SPU/SKU核心概念

核心概念关系:

类目(Category)
  └── SPU(Standard Product Unit,标准化产品单元)
       └── SKU(Stock Keeping Unit,库存量单位)

类比理解:
  类目:手机
  SPU:iPhone 16 Pro (一"款"产品)
  SKU:iPhone 16 Pro 256GB 银色 (一"件"具体商品)

SPU描述的是"产品的共同特征":
  ├── 品牌:Apple
  ├── 型号:iPhone 16 Pro
  ├── 处理器:A18 Pro
  ├── 屏幕:6.3英寸
  └── 上市时间:2024年9月

SKU描述的是"可购买的最小单位":
  ├── 颜色:银色/黑色/白色/沙漠色/自然色
  ├── 存储:128GB/256GB/512GB/1TB
  ├── 价格:不同SKU不同价格
  └── 库存:每个SKU独立库存

SPU/SKU的关系

SPU和SKU的关系:

  SPU: iPhone 16 Pro
    │
    ├── SKU-001: 银色-128GB  → ¥7999  → 库存50
    ├── SKU-002: 银色-256GB  → ¥8999  → 库存30
    ├── SKU-003: 银色-512GB  → ¥10999 → 库存20
    ├── SKU-004: 银色-1TB    → ¥12999 → 库存10
    ├── SKU-005: 黑色-128GB  → ¥7999  → 库存45
    ├── SKU-006: 黑色-256GB  → ¥8999  → 库存35
    ├── ...
    └── SKU-020: 自然色-1TB → ¥12999 → 库存5

  SKU数量 = 颜色选项数 × 存储选项数
           = 5 × 4 = 20个SKU

  这就是"属性笛卡尔积":
  销售属性A的选项 × 销售属性B的选项 × ... = SKU总数

电商平台的商品层次

自营电商(京东自营):
  SPU → SKU (两层结构)

平台电商(淘宝/天猫):
  SPU → 商家商品(Merchant Product) → SKU (三层结构)

  为什么需要三层?
  ├── 同一个SPU(iPhone 16 Pro)可能有多个商家售卖
  ├── 每个商家有自己的价格、库存、服务
  ├── 平台需要汇聚展示(比价、推荐)
  └── CSPU(Child SPU)进一步管控商家发布质量

示例:
  SPU: iPhone 16 Pro
    ├── 商家A(Apple官方旗舰店)
    │   ├── SKU-A1: 银色-256GB → ¥8999
    │   └── SKU-A2: 黑色-256GB → ¥8999
    ├── 商家B(京东自营)
    │   ├── SKU-B1: 银色-256GB → ¥8899
    │   └── SKU-B2: 黑色-256GB → ¥8899
    └── 商家C(第三方卖家)
        ├── SKU-C1: 银色-256GB → ¥8799
        └── SKU-C2: 黑色-256GB → ¥8799

2. 属性管理

属性分类

商品属性分类:

1. 关键属性(Key Attributes)
   ├── 用于唯一确定一个SPU
   ├── 品牌 + 型号 → 唯一SPU
   └── 例:品牌=Apple, 型号=iPhone 16 Pro

2. 销售属性(Sale Attributes)
   ├── 用于生成SKU(笛卡尔积)
   ├── 影响价格和库存
   └── 例:颜色、尺寸、存储容量

3. 非关键属性(Non-key Attributes)
   ├── 商品描述信息(不影响SKU)
   ├── 用于搜索过滤和详情展示
   └── 例:处理器、屏幕尺寸、重量、产地

属性模板(Attribute Template)

属性模板设计:
  每个类目定义一套属性模板
  商品发布时按模板填写属性值

示例:手机类目属性模板
┌──────────────────────────────────────────────┐
│  手机类目属性模板                               │
├──────────────────────────────────────────────┤
│  关键属性:                                    │
│  ├── 品牌 (必填, 枚举: Apple/Samsung/...)     │
│  └── 型号 (必填, 文本)                        │
│                                              │
│  销售属性:                                    │
│  ├── 颜色 (必填, 多选: 银/黑/白/...)         │
│  └── 存储容量 (必填, 多选: 128GB/256GB/...)   │
│                                              │
│  非关键属性:                                  │
│  ├── 处理器 (选填, 文本)                      │
│  ├── 屏幕尺寸 (选填, 数值+单位)              │
│  ├── 摄像头 (选填, 文本)                      │
│  ├── 电池容量 (选填, 数值mAh)                │
│  ├── 重量 (选填, 数值g)                      │
│  ├── 防水等级 (选填, 枚举: IP67/IP68)        │
│  └── 5G支持 (选填, 是/否)                    │
└──────────────────────────────────────────────┘

属性值继承

属性值继承机制:

类目级默认值:
  手机类目 → 5G支持=是 (类目默认)

SPU级属性值:
  iPhone 16 Pro → 品牌=Apple, 处理器=A18 Pro

SKU级属性值(销售属性):
  SKU-001 → 颜色=银色, 存储=128GB

继承链:
  类目默认 → SPU覆盖 → SKU覆盖
  (低优先级)         (高优先级)

查询时:
  先查SKU属性 → 没有则查SPU → 没有则查类目默认

3. 类目体系设计

前台类目 vs 后台类目

后台类目(管理分类):
  ├── 固定树形结构(3级)
  ├── 用于商品管理和属性模板关联
  ├── 一个商品只属于一个后台类目
  └── 变更频率低(年度调整)

  电子产品
  ├── 手机
  │   ├── 智能手机
  │   └── 功能手机
  ├── 平板电脑
  └── 笔记本电脑

前台类目(浏览分类):
  ├── 灵活多变(可重组)
  ├── 用于用户浏览和导航
  ├── 一个商品可属于多个前台类目
  └── 变更频率高(运营调整)

  热门推荐
  ├── 学生开学季 → 手机+平板+笔记本
  ├── 送礼精选 → 手机+手表+耳机
  └── 5G新品 → 各品牌5G手机

为什么要分离?
  后台类目:稳定、标准、一对一
  前台类目:灵活、可运营、多对多
  分离后运营可以自由调整前台导航,不影响后台管理

类目关联设计

类目关联模式:

模式一:树形结构(单继承)
  后台类目通常使用
  一个子类目只有一个父类目
  简单清晰,但不灵活

  Root
  ├── Level 1 (大类)
  │   ├── Level 2 (中类)
  │   │   ├── Level 3 (小类)
  │   │   └── Level 3
  │   └── Level 2
  └── Level 1

模式二:DAG(有向无环图)
  前台类目可以使用
  一个类目可以属于多个父类目
  灵活但复杂

  "iPhone 16" 可以同时出现在:
  ├── 手机 > 苹果手机
  ├── 新品推荐
  └── 5G精选

模式三:标签体系(Tag)
  配合类目使用
  自由标注,支持搜索和筛选
  例:#5G #折叠屏 #旗舰 #学生推荐

4. 价格体系

价格体系层次:

┌──────────────────────────────────────────────┐
│                 价格体系                       │
│                                              │
│  ┌──────────────────────────────────┐       │
│  │  基础价(Base Price)              │       │
│  │  = 商品的标准零售价              │       │
│  │  通常由商品中心管理              │       │
│  └──────────────────────────────────┘       │
│           │                                   │
│           ▼                                   │
│  ┌──────────────────────────────────┐       │
│  │  渠道价(Channel Price)           │       │
│  │  ├── App价格                    │       │
│  │  ├── 小程序价格                  │       │
│  │  ├── 门店价格                    │       │
│  │  └── 第三方平台价格              │       │
│  └──────────────────────────────────┘       │
│           │                                   │
│           ▼                                   │
│  ┌──────────────────────────────────┐       │
│  │  会员价(Member Price)            │       │
│  │  ├── 普通会员 95折               │       │
│  │  ├── 金卡会员 9折                │       │
│  │  └── 黑卡会员 85折               │       │
│  └──────────────────────────────────┘       │
│           │                                   │
│           ▼                                   │
│  ┌──────────────────────────────────┐       │
│  │  促销价(Promotion Price)         │       │
│  │  ├── 限时折扣                    │       │
│  │  ├── 满减/满折                   │       │
│  │  ├── 优惠券                     │       │
│  │  └── 秒杀价                     │       │
│  └──────────────────────────────────┘       │
│           │                                   │
│           ▼                                   │
│  ┌──────────────────────────────────┐       │
│  │  区域价(Regional Price)          │       │
│  │  ├── 一线城市价格                │       │
│  │  ├── 二三线城市价格              │       │
│  │  └── 海外价格                    │       │
│  └──────────────────────────────────┘       │
│                                              │
│  最终价格 = f(基础价, 渠道, 会员, 促销, 区域)  │
│  需要明确优先级和叠加规则!                     │
└──────────────────────────────────────────────┘

价格计算规则

价格叠加/互斥规则(示例):

规则1: 会员价和促销价取最低
  会员价=¥899, 促销价=¥859 → 最终¥859

规则2: 优惠券可以叠加在促销价上
  促销价=¥859, 优惠券-¥50 → 最终¥809

规则3: 有保底价(不能低于成本)
  if 最终价格 < 成本价 × 保底系数:
    最终价格 = 成本价 × 保底系数

规则4: 渠道价独立
  App渠道有专属价格时,覆盖基础价

价格优先级:
  秒杀价 > 促销价 > 会员价 > 渠道价 > 基础价

价格防护(防止资损):
  ├── 改价审批(大幅降价需审核)
  ├── 保底价校验(不低于成本+X%)
  ├── 价格变更日志(审计)
  └── 价格异常告警

5. 商品参数化(SKU笛卡尔积)

SKU生成过程(笛卡尔积):

步骤1:选择销售属性
  颜色:[银色, 黑色, 白色]      → 3个选项
  存储:[128GB, 256GB, 512GB]  → 3个选项

步骤2:生成笛卡尔积
  颜色 × 存储 = 3 × 3 = 9个SKU

  SKU-1: 银色 + 128GB
  SKU-2: 银色 + 256GB
  SKU-3: 银色 + 512GB
  SKU-4: 黑色 + 128GB
  SKU-5: 黑色 + 256GB
  SKU-6: 黑色 + 512GB
  SKU-7: 白色 + 128GB
  SKU-8: 白色 + 256GB
  SKU-9: 白色 + 512GB

步骤3:为每个SKU设置价格和库存
  SKU-1: ¥7999, 库存50
  SKU-2: ¥8999, 库存30
  ...

注意SKU爆炸问题:
  服装:颜色(10) × 尺码(8) = 80个SKU
  鞋类:颜色(10) × 尺码(15) = 150个SKU
  手机:颜色(5) × 存储(4) × 版本(2) = 40个SKU

  当属性维度超过3-4个时,SKU数量指数增长
  → 需要SKU管理策略(不是所有组合都需要)

6. 商品DDD领域模型

/**
 * 商品中心DDD领域模型
 *
 * 聚合根:SPU
 * 实体:SKU, Attribute, PricePolicy
 * 值对象:CategoryPath, AttributeValue
 */

// ===== 聚合根:SPU =====
@AggregateRoot
public class SPU {
    private SPUId id;                    // SPU唯一标识
    private String name;                  // 商品名称
    private String subtitle;              // 副标题
    private BrandId brandId;              // 品牌ID
    private CategoryPath categoryPath;    // 后台类目路径

    // SPU级属性(非关键属性)
    private Map<AttributeId, AttributeValue> attributes;

    // SKU列表
    private List<SKU> skus;

    // 状态
    private SPUStatus status;             // DRAFT/REVIEW/ONLINE/OFFLINE

    // 商品描述(富文本/AIGC)
    private ProductDescription description;

    // 媒体资源
    private List<MediaResource> images;
    private List<MediaResource> videos;

    // 业务方法
    public SKU addSKU(Map<SaleAttribute, String> saleAttrs,
                       Money price, int stock) {
        // 校验销售属性组合不重复
        validateUniqueSaleAttributes(saleAttrs);
        SKU sku = new SKU(generateSKUId(), this.id, saleAttrs, price, stock);
        this.skus.add(sku);
        return sku;
    }

    public void online() {
        // 上架校验
        validateForOnline();
        this.status = SPUStatus.ONLINE;
        registerEvent(new SPUOnlinedEvent(this.id));
    }

    public void offline() {
        this.status = SPUStatus.OFFLINE;
        registerEvent(new SPUOfflinedEvent(this.id));
    }
}

// ===== 实体:SKU =====
@Entity
public class SKU {
    private SKUId id;                     // SKU唯一标识
    private SPUId spuId;                  // 所属SPU
    private String skuCode;               // SKU编码(条码/货号)

    // 销售属性组合(确定唯一SKU)
    private Map<SaleAttribute, String> saleAttributes;
    // 例: {颜色: "银色", 存储: "256GB"}

    // 价格
    private Money basePrice;              // 基础价
    private Money costPrice;              // 成本价

    // 状态
    private SKUStatus status;             // ACTIVE/INACTIVE

    // 物流属性
    private Weight weight;                // 重量
    private Dimension dimension;          // 尺寸(长宽高)
}

// ===== 实体:类目 =====
@Entity
public class Category {
    private CategoryId id;
    private String name;
    private CategoryId parentId;          // 父类目
    private int level;                    // 层级(1/2/3)
    private CategoryType type;            // BACKEND/FRONTEND
    private boolean isLeaf;               // 是否叶子节点

    // 属性模板
    private AttributeTemplate attributeTemplate;

    // 前台类目关联的后台类目(多对多)
    private List<CategoryId> linkedBackendCategories;
}

// ===== 值对象:属性模板 =====
@ValueObject
public class AttributeTemplate {
    private CategoryId categoryId;

    // 关键属性定义
    private List<AttributeDefinition> keyAttributes;

    // 销售属性定义
    private List<AttributeDefinition> saleAttributes;

    // 非关键属性定义
    private List<AttributeDefinition> nonKeyAttributes;
}

// ===== 值对象:属性定义 =====
@ValueObject
public class AttributeDefinition {
    private AttributeId id;
    private String name;                  // 属性名
    private AttributeType type;           // TEXT/NUMBER/ENUM/MULTI_ENUM/BOOLEAN
    private boolean required;             // 是否必填
    private List<String> enumValues;      // 枚举值列表(如有)
    private String unit;                  // 单位(如有)
    private String defaultValue;          // 默认值
    private int sortOrder;                // 排序
}

// ===== 实体:价格策略 =====
@Entity
public class PricePolicy {
    private PricePolicyId id;
    private SKUId skuId;
    private PriceType type;               // BASE/CHANNEL/MEMBER/PROMOTION/REGIONAL
    private Money price;
    private String channelCode;           // 渠道(如适用)
    private MemberLevel memberLevel;      // 会员等级(如适用)
    private String regionCode;            // 区域(如适用)
    private LocalDateTime startTime;      // 生效时间
    private LocalDateTime endTime;        // 失效时间
    private int priority;                 // 优先级
}

// ===== 值对象:类目路径 =====
@ValueObject
public class CategoryPath {
    private CategoryId level1;  // 一级类目
    private CategoryId level2;  // 二级类目
    private CategoryId level3;  // 三级类目

    public String getFullPath() {
        return level1 + "/" + level2 + "/" + level3;
    }
}

7. 大量SKU管理策略

面对海量SKU(数十亿)的管理策略:

1. 存储分层
   ├── 热数据(活跃SKU):Redis缓存
   ├── 温数据(近期SKU):MySQL/TiDB
   └── 冷数据(下架SKU):归档存储(OSS/HBase)

2. 搜索优化
   ├── Elasticsearch索引商品+属性
   ├── 属性值标准化(防止"红色"和"Red"重复)
   ├── 分词优化(商品名+属性+品牌)
   └── 向量搜索(语义相似商品)

3. 属性管理
   ├── 属性值字典(统一管理枚举值)
   ├── 属性继承(减少重复定义)
   ├── 属性校验(格式/范围/必填)
   └── AI自动标注(图像识别→属性)

4. SKU精简
   ├── 低销SKU下架(长尾清理)
   ├── 重复SKU合并
   ├── 属性组合限制(不是所有组合都开放)
   └── 按需生成SKU(而非预生成所有组合)

5. 性能优化
   ├── 商品详情页静态化(CDN)
   ├── 属性查询缓存(多级缓存)
   ├── 批量操作(批量改价/上下架)
   └── 异步索引更新(MQ+ES)

对比分析

各平台商品模型对比

平台商品层次SKU量级属性管理特色
淘宝/天猫SPU→商家商品→SKU百亿+类目属性模板+商家自定义CSPU标准化管控
京东SPU→SKU数十亿标准属性+自定义属性自营严格品控
拼多多商品→SKU数十亿简化属性低门槛快速发布
AmazonASIN→Offer百亿+Product Type+Attributes全球统一编码
ShopifyProduct→Variant中小规模最多3个Option+100 Variant简单灵活

商品数据结构方案对比

方案优势劣势适用场景
宽表(所有属性列)查询简单属性变更要改表属性固定的少品类
EAV(属性值表)灵活扩展查询复杂(多次JOIN)属性变化大的多品类
JSON字段灵活+查询尚可索引支持有限中等规模
ES+MySQL灵活+高性能搜索数据一致性维护大规模电商(主流)

架构设计实操

设计目标

设计一个"全品类商品DDD领域模型",包含:

  • SPU/SKU/Attribute/Category/Price五大实体
  • 支持多品类属性模板
  • 支持价格分层管理
  • 支持前后台类目分离

(领域模型已在上方"知识点详解-6"中完整给出)

ADR: 商品属性存储方案

## ADR-067: 商品属性存储方案选型

### 状态: 已采纳

### 上下文
全品类商品中心,不同类目属性差异大(手机vs服装vs食品),
需要灵活的属性存储方案。

### 可选方案
A. 宽表(每个类目一张表,列=属性)
B. EAV(Entity-Attribute-Value,三张表)
C. JSON字段(MySQL JSON / PostgreSQL JSONB)
D. ES索引 + MySQL基础信息

### 决策
采用方案D:MySQL存储基础信息(SPU/SKU/类目) +
ES存储全量属性(搜索/过滤) + Redis缓存热数据

### 理由
1. MySQL管理核心实体和关系(事务保证)
2. ES支持灵活的属性搜索和过滤(不需要ALTER TABLE)
3. Redis缓存商品详情(高并发读)
4. 属性变更通过MQ同步到ES(准实时)
5. 这是淘宝/京东等大厂的主流方案

### 后果
- 需要维护MySQL↔ES数据一致性
- ES集群运维成本
- 属性变更有秒级延迟(异步同步)

AI增强实践

AI在商品中心的革新应用

2025-2026年AI在商品中心的应用:

1. AI自动标注属性
   ├── 图像识别→颜色/材质/款式
   ├── OCR→品牌/型号/参数
   ├── NLP→标题解析→结构化属性
   └── 准确率:85-95%(需人工审核)

2. AIGC商品内容生成
   ├── 商品标题优化(SEO)
   ├── 商品描述自动生成
   ├── 卖点提炼(基于评价分析)
   ├── 多语言翻译(跨境电商)
   └── 商品图片生成(场景图/3D)

3. AI分类与类目推荐
   ├── 自动归类到后台类目
   ├── 推荐最佳前台类目
   ├── 新品类目建议
   └── 同类商品聚合(去重)

4. 智能定价
   ├── 竞品价格监控
   ├── 动态定价建议
   ├── 促销效果预测
   └── 弹性定价(需求曲线)

5. 商品质量检测
   ├── 图片质量检测(模糊/水印)
   ├── 违禁品识别(文本+图片)
   ├── 虚假宣传检测
   └── 合规检查(3C/FDA等)

实际案例(2025):
├── 淘宝:AIGC生成40%+商品描述
├── Amazon:AI Review Insights(评价摘要)
├── Shopify:Magic(AI商品文案生成)
└── 拼多多:AI辅助商品图片优化

与Web3/DeFi的关联

商品NFT化

商品NFT化方向:

1. 实物商品NFT凭证
   ├── 购买实物→获得NFT(数字凭证)
   ├── NFT可转让/交易(二手市场)
   ├── NFT验证真伪(防伪溯源)
   └── 案例:Nike .SWOOSH运动鞋NFT

2. 数字商品(原生NFT)
   ├── 数字服装(虚拟穿搭)
   ├── 游戏道具
   ├── 数字艺术品
   └── 音乐/视频NFT

3. 商品Token化
   ├── 碳信用Token化(商品碳足迹)
   ├── 供应链金融Token(应收账款)
   ├── 预售Token(商品期货)
   └── 忠诚度Token(积分上链)

商品中心扩展(支持Web3):
├── SKU增加Token合约地址字段
├── NFT元数据与商品属性映射
├── 链上验证API(真伪/所有权)
└── 跨平台商品互通(链上标准)

今日思考

三个深度问题

  1. SPU/SKU模型在万物互联时代是否过时? 传统SPU/SKU模型是为实物商品设计的。当商品形态扩展到数字商品(NFT)、服务(SaaS订阅)、虚拟+实物组合(手机+保险+延保+教程)时,现有模型是否需要根本性重构?还是通过扩展属性可以解决?

  2. AIGC对商品中心的"颠覆":当AI可以自动生成商品标题、描述、图片甚至定价建议时,商品中心的角色会如何变化?是从"人工录入的数据库"变为"AI生产的内容平台"?这对系统架构有什么影响?

  3. 全球商品编码的统一问题:Amazon用ASIN,阿里用SPU,各平台的商品ID体系互不兼容。Web3是否可以提供一个全球统一的商品ID标准(类似ERC-721的唯一性)?区块链上的商品注册是否有价值?


面试题准备

面试题1: SPU和SKU的关系?

30秒回答: SPU是标准化产品单元(一"款"产品),SKU是库存量单位(一"件"可购买的具体商品)。一个SPU可以有多个SKU,通过销售属性(颜色/尺码/容量)的笛卡尔积生成。例如iPhone 16 Pro是一个SPU,iPhone 16 Pro银色256GB是一个SKU。SPU描述共同特征,SKU决定价格和库存。

2分钟详细回答: SPU/SKU的关系需要从三个层面理解:

数据层面:SPU是商品的抽象描述,包含品牌、型号、通用属性等;SKU是具体的可购买单元,由SPU+销售属性组合确定。SKU是库存管理和交易的最小单位。

生成规则:SKU通过销售属性的笛卡尔积生成。如颜色3种×尺码5种=15个SKU。但并非所有组合都必须生成——可以根据实际备货情况选择性开放。

平台差异:自营电商(京东自营)用SPU→SKU两层;平台电商(淘宝)用SPU→商家商品→SKU三层,因为同一个SPU可能有多个商家售卖。

追问准备

  • Q: SKU爆炸怎么处理?
  • A: 三个策略——限制销售属性维度(不超过3-4个)、按需生成SKU(不预生成所有组合)、定期清理低销SKU。

面试题2: 大量SKU下如何高效管理属性?

30秒回答: 大规模SKU属性管理的核心方案是"类目属性模板+ES搜索"。通过类目属性模板标准化每个品类的属性定义(必填/选填/枚举),MySQL存储核心实体关系,ES存储全量属性支持灵活搜索过滤,Redis缓存热点商品详情。属性变更通过MQ异步同步到ES,保证准实时一致性。

追问准备

  • Q: EAV和JSON字段为什么不选?
  • A: EAV查询需要多次JOIN,性能差;JSON字段在MySQL中索引支持有限(虽然MySQL 8.0改善了)。ES天然支持动态Schema和全文搜索,是大规模商品属性管理的主流方案。

学习资源

资源类型说明
淘宝商品模型分析文章SPU/SKU/商品层次详解
Shopify Product API文档商品数据模型参考
Elasticsearch权威指南文档搜索引擎
Amazon Product Advertising API文档商品数据结构参考
DDD与电商领域建模书籍领域驱动设计

明日预告

Day 68: 库存系统设计

  • 库存类型(可售/实物/在途/预占/冻结)
  • 库存扣减策略(下单减/支付减/发货减)
  • 全渠道库存统一视图
  • 分布式库存扣减(Redis预扣→DB持久化)
  • 高并发下防超卖