关于 product-data-modeling
面向电商开发者的产品数据建模技能,涵盖 Shopify、WooCommerce、BigCommerce 及自定义无头商店。它帮助规划商品、变体、属性与关联关系,减少目录数据问题和导入失败。
主要功能
- 01梳理平台商品数据模型
- 02设计商品与变体结构
- 03规划自定义属性和筛选
- 04建模商品关联关系
- 05指导目录导入与字段更新
适用场景
- 01为新店规划商品目录结构
- 02为商品添加尺寸或颜色变体
- 03设置筛选用的自定义属性
- 04将 PIM 或 ERP 商品数据导入平台
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ finsilabs/ awesome-ecommerce-skills --skill product-data-modeling安装后在 Claude Code 中输入/product-data-modeling确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
tile.jsonevals/core-product-variant-schema-design/criteria.jsontask.mdevals/eav-pattern-and-faceted-filtering/criteria.jsontask.mdevals/relationships-collections-multi-tenant-p/criteria.jsontask.md详细介绍
产品数据建模
概述
每个平台都有自己的产品数据模型——Shopify 使用带有变体和元字段的产品,WooCommerce 使用带有属性和自定义字段的产品,BigCommerce 使用带有选项和自定义字段的产品。了解平台的数据模型,并据此正确组织目录,可以避免数据质量问题和导入失败。只有在从头构建无头店面时,才需要构建自定义数据模型。
何时使用此技能
- 为现有平台上的新店铺设计产品目录结构时
- 为现有产品添加变体支持(尺寸、颜色、材质)时
- 实施用于分面筛选的自定义属性时
- 建模产品关系(套装、交叉销售、配件)时
- 将产品从 PIM 或 ERP 导入平台数据模型时
核心说明
步骤 1:了解平台的核心数据模型
| 平台 | 产品 | 变体 | 自定义属性 | 关系 |
|---|---|---|---|---|
| Shopify | 产品 + 最多 3 个选项,最多 100 个变体 | 每个变体:价格、SKU、库存、重量、图片 | 元字段(标准或自定义命名空间) | 产品系列、通过应用进行交叉销售 |
| WooCommerce | 产品(简单、可变、分组、外部) | 每个变体:价格、SKU、库存、属性 | 自定义产品属性 + WooCommerce 自定义字段 | 追加销售、交叉销售(内置)、分组产品 |
| BigCommerce | 带有选项和选项集的产品 | 每个变体(修改项/选项组合):价格、SKU、库存 | 每个产品的自定义字段 | 相关产品、捆绑产品 |
| 自定义 / 无头 | 使用 PostgreSQL/MongoDB 从头设计 | 完全控制架构 | 使用 EAV 或 JSONB 实现灵活属性 | 使用关联表建立关系 |
步骤 2:平台专属建模
Shopify
核心结构:
- 产品:标题、描述、供应商、product_type、标签、图片
- 选项:最多 3 个(例如,尺寸、颜色、材质)——定义变体的维度
- 变体:每种选项值组合对应一个变体——每个变体都有自己的价格、SKU、库存和重量
- 元字段:每个产品或变体的自定义数据(例如,护理说明、尺码指南 URL、技术规格)
建模决策:
-
产品与变体:如果客户会在同一页面并排比较不同选项,就将它们放在同一条产品记录中。如果产品本质上不同,只是名称相同,则创建单独的产品记录。
-
选项命名:Shopify 将每个产品的选项数限制为 3 个。如果需要更多选项(例如,尺寸 + 颜色 + 材质 + 长度),可以考虑合并两个选项(例如,“尺寸/宽度”),或使用元字段表示第 4 个维度。
-
使用元字段定义自定义属性:前往 Settings → Custom data → Products 创建元字段定义。以下属性应使用元字段:
- 不影响价格或库存的属性(这些应放在变体上)
- 产品专属的自定义数据(护理说明、认证、尺寸)
- 需要在主题中显示或通过搜索应用筛选的属性
-
产品类型和标签:使用
product_type表示主要商品类别(例如,“连衣裙”、“跑步鞋”),并使用tags表示跨类别属性(例如,color-navy、occasion-formal、material-cotton)。
衬衫产品结构示例:
- 产品:“有机棉 T 恤”
- 选项:尺寸(XS、S、M、L、XL)、颜色(白色、黑色、藏青色)
- 变体:15 种组合(5 种尺寸 × 3 种颜色),每种组合都有 SKU 和库存
- 元字段:
care_instructions、material_weight_gsm、sustainability_cert
通过 Matrixify 批量更新字段:
- 导出产品以查看所有受支持的列
- 在电子表格中编辑,然后重新导入,即可批量更新任意字段,包括元字段
WooCommerce
产品类型:
- 简单产品:一个 SKU,一个价格——适用于没有变体的产品
- 可变产品:根据属性创建多个变体——适用于有尺寸、颜色等属性的产品
- 分组产品:将多个简单产品组合展示——适用于产品系列
- 外部/联盟产品:链接到外部 URL——适用于联盟产品
- 虚拟产品:无需配送——适用于服务、订阅
- 可下载产品:数字产品
属性和变体:
-
前往 Products → Attributes 定义全局属性(所有产品共享):
- 添加属性:Color,值为:Red、Blue、Black、White
- 添加属性:Size,值为:XS、S、M、L、XL
- 勾选 Enable archives,使该属性可供浏览
-
在可变产品中,前往 Attributes tab:
- 选择全局属性,并勾选适用于此产品的值
- 前往 Variations tab → 根据所有组合生成变体
-
单个变体设置:为每个变体设置唯一的价格、SKU、库存、图片和重量
自定义字段(产品元数据):
对于并非变体的属性(例如技术规格、认证):
- 使用 WooCommerce 内置的 Custom Attributes(在 Attributes tab 中,选择非变体属性)
- 安装 Advanced Custom Fields (ACF),以更有条理地管理自定义字段
- 安装 Product Add-Ons,添加供客户输入的字段(刻字、个性化定制)
产品关联(内置):
- 追加销售:前往 Linked Products tab → Upsells——显示在产品页面上
- 交叉销售:显示在购物车中——在 Linked Products tab → Cross-sells 下添加
- 分组产品:使用分组产品类型关联相关的简单产品
BigCommerce
核心结构:
- 产品:标题、描述、品牌、类别、重量、图片
- 选项:定义变体维度(Size、Color、Material)
- 选项集:可重复使用的选项组,可分配给多个产品
- 变体(SKU):选项的组合——每个变体都有唯一的 SKU、价格调整值、重量和库存
- 自定义字段:用于存储其他产品数据的自由格式名称/值对
建模决策:
-
前往 Products → Option Sets 创建可重复使用的选项集(例如,包含 XS–3XL 的“Clothing Sizes”)——将同一选项集分配给多个产品,而不是为每个产品重新创建选项。
-
对于变体数量较多的产品:BigCommerce 支持每个产品最多 600 个 SKU。使用 Bulk Pricing 设置适用于变体组的价格规则,而不是为每个变体单独定价。
-
自定义字段:前往 Products → [Product] → Custom Fields tab,添加
Material、Care Instructions、Warranty Period等结构化属性。这些属性会显示在产品详情页上,也可用于搜索。 -
修饰选项(客户在购买时可配置):用于个性化定制(刻字文本、不影响库存的颜色选择)。这与变体不同——修饰选项不会生成单独的 SKU。
自定义 / 无头架构
对于无头店面,请围绕产品-选项-变体模式设计核心架构:
-- Core product tables (PostgreSQL)
CREATE TABLE products (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
slug VARCHAR(255) UNIQUE NOT NULL, -- URL-safe handle
title VARCHAR(500) NOT NULL,
description TEXT,
vendor VARCHAR(255),
product_type VARCHAR(255),
status VARCHAR(20) DEFAULT 'draft' CHECK (status IN ('active', 'draft', 'archived')),
tags TEXT[] DEFAULT '{}',
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
-- Variants — one per purchasable combination
CREATE TABLE product_variants (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
product_id UUID NOT NULL REFERENCES products(id) ON DELETE CASCADE,
sku VARCHAR(255) UNIQUE,
title VARCHAR(500) NOT NULL, -- e.g., "Red / Large"
price NUMERIC(10,2) NOT NULL, -- Use NUMERIC, not FLOAT, to avoid rounding errors
compare_at_price NUMERIC(10,2),
cost_price NUMERIC(10,2),
weight NUMERIC(8,2),
inventory_quantity INTEGER DEFAULT 0,
track_inventory BOOLEAN DEFAULT true,
option1_value VARCHAR(255), -- Denormalized for query performance
option2_value VARCHAR(255),
option3_value VARCHAR(255),
position INTEGER DEFAULT 0
);
-- Options and values — define the variation axes
CREATE TABLE product_options (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
product_id UUID NOT NULL REFERENCES products(id) ON DELETE CASCADE,
name VARCHAR(255) NOT NULL, -- "Color", "Size"
position INTEGER DEFAULT 0,
UNIQUE(product_id, name)
);
-- Flexible attributes via JSONB (alternative to EAV for custom attributes)
ALTER TABLE products ADD COLUMN attributes JSONB DEFAULT '{}';
-- Query example: SELECT * FROM products WHERE attributes->>'material' = 'cotton';
-- Index for common attribute lookups:
CREATE INDEX idx_products_attributes ON products USING GIN(attributes);
-- Product relationships
CREATE TABLE product_relationships (
source_product UUID NOT NULL REFERENCES products(id) ON DELETE CASCADE,
target_product UUID NOT NULL REFERENCES products(id) ON DELETE CASCADE,
relationship VARCHAR(50) NOT NULL CHECK (relationship IN ('cross_sell', 'upsell', 'related', 'accessory')),
position INTEGER DEFAULT 0,
UNIQUE(source_product, target_product, relationship)
);
与此架构匹配的 TypeScript 类型:
interface Product {
id: string;
slug: string; // URL handle — stable identifier
title: string;
description: string;
vendor: string;
productType: string;
status: 'active' | 'draft' | 'archived';
tags: string[];
attributes: Record<string, string | number | boolean>; // Flexible custom attributes
variants: ProductVariant[];
images: ProductImage[];
}
interface ProductVariant {
id: string;
sku: string;
title: string; // Auto-generated: "Red / Large"
price: number; // In cents to avoid floating-point errors
compareAtPrice?: number;
costPrice?: number;
inventoryQuantity: number;
trackInventory: boolean;
option1Value?: string;
option2Value?: string;
option3Value?: string;
}
步骤 3:规划商品关系
每个平台都支持通过商品关系进行交叉销售和追加销售。配置这些关系以提高 AOV:
追加销售:比客户正在查看的商品价值更高的替代商品 — 显示在 PDP 上
- “你正在查看标准版 — 再加 20 美元即可升级到 Pro”
交叉销售:互补商品 — 显示在购物车中
- “购买此商品的客户还买了这些配件”
相关商品:价格相近的类似商品 — 显示在 PDP 底部
- “你可能还喜欢这些商品”
对于 Shopify:在 Products → [Product] → More details 部分进行配置;或使用交叉销售应用自动推荐。
对于 WooCommerce:在每个商品的 Linked Products 选项卡中进行配置。
最佳实践
- 在自定义构建中将价格存储为整数(美分) — 将
$29.99存储为2999,可避免浮点数舍入误差 - 始终将商品与变体分开 — 即使商品只有一个变体,也应有一行变体记录,以确保购物车和订单逻辑一致
- URL 使用 slug,内部引用使用 ID — slug 便于人类阅读,有利于 SEO;UUID 可防止枚举攻击
- 使用商品类型和标签进行筛选,而非创建单独的商品 — “蓝色连衣裙”和“红色连衣裙”应是变体,而非单独的商品
- 将非变体数据放入元字段/自定义字段 — 不影响价格或库存的属性应放入元字段,而非作为变体
- 上线前测试变体组合 — 确认所有可购买的组合都能在店面变体选择器中正确显示
常见问题
| 问题 | 解决方案 |
|---|---|
| 变体数量激增(5 种颜色 × 8 种尺码 × 3 种材质 = 120 个变体) | Shopify 将每个商品的变体数量限制为 100 个;如果大多数组合不会单独备货,可考虑将第三个选项轴改用元字段 |
| 自定义属性未出现在商品搜索中 | 在 Shopify 中:在主题或搜索应用设置中启用元字段搜索;在 WooCommerce 中:对要编入索引的属性启用“Used for variations” |
| 整个目录中的商品类型和标签不一致 | 导入前先为商品类型和标签建立受控词汇表;使用 Matrixify 或 WP All Import 批量统一 |
| 选择尺码/颜色时变体图片未切换 | 在平台管理后台为变体分配专属图片;变体需要有自己的图片,而不仅是商品级图片,才能触发切换 |
相关技能
- @variant-matrix
- @catalog-import-export
- @product-categorization
- @product-content-enrichment