多规格商品设计

冷链商品完整逻辑关系文档

四层核心模型:SPU(商城展示) → SKU(交易货品) → Batch(库存批次) → Inventory(库位数量形态)
业务样例:SPU=泰国黑虎虾;基础库存单位:袋;包装换算:1箱=10袋

全局约束

  1. product_sku_spec联合主键:sku_id + spec_key_id,一个SKU同一个规格维度仅允许1个值
  2. spec_signature后端生成:按spec_key_id ASC拼接keyId:valueId;;唯一索引 spu_id + spec_signature,防重复SKU
  3. 销售规格spec体系 和 包装单位sku_pack_rule严格隔离,箱/袋属于包装规则,不进spec规格维度

① product_spu 商品主体|商城展示层

聚合SKU公共属性;前端商品详情页渲染;SPU不能直接采购、下单

idspu_codecategory_idbrand_idnamesubtitleorigin_countryorigin_regionstorage_typestatus
1001SPU‑HX‑0015012泰国黑虎虾冷冻进口海产大虾泰国曼谷冷冻1

② product_spec_key 规格维度|SPU下定义有哪些规格

外键:spu_id → product_spu.id

idspu_idspec_namesortstatus
11001净含量11
21001虾规格21

③ product_spec_value 规格值|每个维度下可选选项

外键:spec_key_id → product_spec_key.id

idspec_key_idspec_valuesortstatus
1111kg11
1212kg21
21220/3011
22230/4021

维度‑值汇总

spec_key_id维度名称规格值ID规格值文本
1净含量111kg
1净含量122kg
2虾规格2120/30
2虾规格2230/40

运营维护维度选项;系统笛卡尔积批量生成SKU;供给前端渲染规格选择器

④ product_sku SKU主表|交易核心

外键:spu_id → product_spu.id

spec_signature后端内部字段,不展示,用于防重;每条SKU = 独立货品;库存/采购/成本隔离;base_unit_code=bag底层单位为袋

idspu_idsku_codebarcodesku_namenet_weightbase_unit_codesale_pricestatus
20011001SKU‑HX‑001690001泰国黑虎虾 1kg 20/301000bag89.001
20021001SKU‑HX‑002690002泰国黑虎虾 1kg 30/401000bag79.001
20031001SKU‑HX‑003690003泰国黑虎虾 2kg 20/302000bag165.001
20041001SKU‑HX‑004690004泰国黑虎虾 2kg 30/402000bag145.001

spec_signature:

  • 2001:1:11;2:21
  • 2002:1:11;2:22
  • 2003:1:12;2:21
  • 2004:1:12;2:22

⑤ product_sku_spec SKU‑规格中间表

外键:sku_id / spec_key_id / spec_value_id;联合主键 sku_id + spec_key_id

spec_key_name、spec_value_name为JOIN读出,本表只存ID做数据库约束

sku_idspec_key_idspec_value_idspec_key_name(联读)spec_value_name(联读)
2001111净含量1kg
2001221虾规格20/30
2002111净含量1kg
2002222虾规格30/40
2003112净含量2kg
2003221虾规格20/30
2004112净含量2kg
2004222虾规格30/40

SKU‑签名‑规格核对表

sku_idspec_signature维度ID:维度名值ID:值文本完整规格
20011:11;2:211:净含量、2:虾规格11:1kg、21:20/30净含量1kg,虾规格20/30
20021:11;2:221:净含量、2:虾规格11:1kg、22:30/40净含量1kg,虾规格30/40
20031:12;2:211:净含量、2:虾规格12:2kg、21:20/30净含量2kg,虾规格20/30
20041:12;2:221:净含量、2:虾规格12:2kg、22:30/40净含量2kg,虾规格30/40

⑥ sku_pack_rule SKU包装规则|与销售规格分离

外键:sku_id;base_qty等于多少个基础库存单位(袋);示例 sku_id=2001,每个SKU独立配置

idsku_idunit_codeunit_namebase_qtyis_base_unitis_sale_unitis_purchase_unitstatus
30012001bag袋11111
30022001box箱100111

业务含义

  • 袋:基础库存单位;可采购、可销售;1袋 = 1底层库存
  • 箱:业务包装;可采购、可销售;1箱 = 10袋底层库存

用户下单/采购选箱,系统内部换算为基础单位袋操作库存;箱袋不属于spec规格

⑦ sku_batch 库存批次|冷链真相源

外键:sku_id;库存底层单位:袋;出库FIFO

idsku_idbatch_noproduce_dateexpire_dateavailable_stockwarehouse_id
40012001B202609050012026‑09‑052027‑09‑0599W01冷冻库
40022001B202609060012026‑09‑062027‑09‑063W01冷冻库

sku2001总库存 = sum(available_stock)=102袋;采购入库生成批次;出库优先消耗旧批次


ER文字关系图

product_spu[id=1001 泰国黑虎虾]
    │
    ├─ product_spec_key[id=1净含量,id=2虾规格]  spu_id=1001
    │       │
    │       └─ product_spec_value[id11/12/21/22] spec_key_id关联key表
    │               │
    │               └─ product_sku_spec(中间关联表 sku_id+spec_key_id+spec_value_id)
    │
    └─ product_sku[id2001‑2004 4个独立货品SKU] spu_id=1001
           │
           ├─ product_sku_spec(回连规格ID)
           ├─ sku_pack_rule(袋/箱包装换算规则,每个SKU独立)
           │
           └─ sku_batch(多批次冷链库存,绑定sku_id;库存以基础单位袋计数)

外键对照表

字段所在表关联目标表.主键示例值
spu_idproduct_spec_key / product_skuproduct_spu.id1001
spec_key_idproduct_spec_value / product_sku_specproduct_spec_key.id1、2
spec_value_idproduct_sku_specproduct_spec_value.id11、12、21、22
sku_idproduct_sku_spec / sku_pack_rule / sku_batchproduct_sku.id2001‑2004

核心业务流程

流程1:新建商品(运营)

  1. 创建product_spu公共商品信息
  2. 录入product_spec_key规格维度、product_spec_value规格选项
  3. 系统笛卡尔积生成product_sku,自动生成spec_signature防重,批量写入product_sku_spec
  4. 每个SKU配置sku_pack_rule包装单位

SPU不改动;新增规格选项自动生成新SKU

流程2:采购入库

  1. 采购明细绑定sku_id,业务可选采购单位箱/袋
  2. 通过sku_pack_rule.base_qty换算底层基础单位(袋)
  3. 入库新增sku_batch批次,写入生产日期、效期、可用库存

❗采购不操作spec表;重量、数量读取SKU物理字段,不解析规格字符串

流程3:用户下单销售

  1. SPU页面通过spec渲染规格选择器,选中得到sku_id
  2. 用户选择销售单位(箱/袋)换算底层基础单位
  3. FIFO顺序扣减sku_batch批次库存

流程4:约束校验

  1. 相同规格组合SKU:spu_id + spec_signature唯一索引拦截
  2. product_sku_spec联合主键:防止同一个SKU同一个规格维度绑定多个值

关键边界区分

  1. SPU:商城聚合展示,不是货品;SKU:真实交易货品,不同规格=不同SKU,库存成本隔离
  2. spec体系:只用于前端展示、批量生成SKU;不参与库存、采购计算
  3. 箱/袋包装放在sku_pack_rule;禁止放入spec规格维度
  4. 冷链库存真相源是sku_batch;SKU总库存为批次sum;批次管控效期、生产日期