3.1 KiB
商品与 SKU 数据模型
目标数据库:PostgreSQL。单位统一存储为毫米(
mm)和克(g)。所有租户数据必须拥有或可追溯至workspace_id。
1. 云端租户层
users ── workspace_memberships ── workspaces
└─ stores ── platform_connections
stores 保存平台标识、市场/国家、默认 locale、默认币种和连接状态。敏感凭据经加密后保存在专用连接密钥记录中,绝不放进前端、日志或商品 JSON。
2. 商品领域
stores 1 ── N products (SPU) 1 ── N product_variants (SKU)
├── product_attributes
├── product_assets ── variant_media
└── pricing_defaults ── variant_pricing_snapshots
每个父商品至少有一条 SKU。products 保存通用标题、简介、型号、条形码、采买地址、货源备注、目标市场/类目引用、富内容、默认规格及默认计价参数。可翻译内容不能只存一列,应以 product_translations(语言/市场、字段、值、来源、状态)或等价模型保存。
product_variants 保存:稳定来源键、展示名、启用/排序、SKU 货号、采购价、售价、划线价、币种、SKU 规格、包装物流规格、实物规格、发布映射和时间戳。offer_id 对同一门店/平台连接必须唯一。
3. 双规格和继承
父商品可提供默认的实物/包装规格;SKU 可以逐字段覆盖:
- 实物:
physical_length_mm、physical_width_mm、physical_height_mm、net_weight_g;用于规格展示、文案和尺寸图。 - 包装物流:
package_length_mm、package_width_mm、package_height_mm、shipping_weight_g;用于定价、物流校验和平台发布。
值按“SKU 覆盖 → 父商品默认”合并;两组规格独立合并。null 表示该字段继承,不是零,也不是 SKU 不存在。每组须有来源、原始文本、状态(confirmed/ambiguous/missing)和确认时间;口径未知的数据不能落入任一规格组。
4. 动态属性和媒体
product_attributes 使用结构化行保存 scope(common/variant)、本地 key、平台属性 ID、复杂属性 ID、JSON 值、语言、来源与确认状态。平台 schema 驱动类型、必填、字典、多值和 is_aspect;is_aspect=true 默认 variant scope,但允许业务覆盖。
product_assets 保存资产事实和对象存储 URL;variant_media 保存 SKU 对资产的图片/视频/封面选择与顺序。资产归属一律用稳定 ID;采集平台无法稳定给 SKU 归属时,只作为商品级候选池。
5. 定价、任务和发布
variant_pricing_snapshots 保存确认时的输入、合并后的包装规格、公式版本、汇率、结果、告警和时间;导出/发布时服务端重新校验,不能信任浏览器结果。所有 AI、媒体、导出和发布任务保存 workspace_id、product_id 与可空/必填的 variant_id,可重试、可恢复并隔离租户。