mcpField
P
product-data-modeling

product-data-modeling

github.com/finsilabs数据与数据库6088 次安装5 天前更新
代码仓库

关于 product-data-modeling

面向电商开发者的产品数据建模技能,涵盖 Shopify、WooCommerce、BigCommerce 及自定义无头商店。它帮助规划商品、变体、属性与关联关系,减少目录数据问题和导入失败。

主要功能

  1. 01梳理平台商品数据模型
  2. 02设计商品与变体结构
  3. 03规划自定义属性和筛选
  4. 04建模商品关联关系
  5. 05指导目录导入与字段更新

适用场景

  1. 01为新店规划商品目录结构
  2. 02为商品添加尺寸或颜色变体
  3. 03设置筛选用的自定义属性
  4. 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.json
evals/core-product-variant-schema-design/
criteria.json
task.md
evals/eav-pattern-and-faceted-filtering/
criteria.json
task.md
evals/relationships-collections-multi-tenant-p/
criteria.json
task.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、技术规格)

建模决策:

  1. 产品与变体:如果客户会在同一页面并排比较不同选项,就将它们放在同一条产品记录中。如果产品本质上不同,只是名称相同,则创建单独的产品记录。

  2. 选项命名:Shopify 将每个产品的选项数限制为 3 个。如果需要更多选项(例如,尺寸 + 颜色 + 材质 + 长度),可以考虑合并两个选项(例如,“尺寸/宽度”),或使用元字段表示第 4 个维度。

  3. 使用元字段定义自定义属性:前往 Settings → Custom data → Products 创建元字段定义。以下属性应使用元字段:

    • 不影响价格或库存的属性(这些应放在变体上)
    • 产品专属的自定义数据(护理说明、认证、尺寸)
    • 需要在主题中显示或通过搜索应用筛选的属性
  4. 产品类型和标签:使用 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——适用于联盟产品
  • 虚拟产品:无需配送——适用于服务、订阅
  • 可下载产品:数字产品

属性和变体:

  1. 前往 Products → Attributes 定义全局属性(所有产品共享):

    • 添加属性:Color,值为:Red、Blue、Black、White
    • 添加属性:Size,值为:XS、S、M、L、XL
    • 勾选 Enable archives,使该属性可供浏览
  2. 在可变产品中,前往 Attributes tab:

    • 选择全局属性,并勾选适用于此产品的值
    • 前往 Variations tab → 根据所有组合生成变体
  3. 单个变体设置:为每个变体设置唯一的价格、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、价格调整值、重量和库存
  • 自定义字段:用于存储其他产品数据的自由格式名称/值对

建模决策:

  1. 前往 Products → Option Sets 创建可重复使用的选项集(例如,包含 XS–3XL 的“Clothing Sizes”)——将同一选项集分配给多个产品,而不是为每个产品重新创建选项。

  2. 对于变体数量较多的产品:BigCommerce 支持每个产品最多 600 个 SKU。使用 Bulk Pricing 设置适用于变体组的价格规则,而不是为每个变体单独定价。

  3. 自定义字段:前往 Products → [Product] → Custom Fields tab,添加 Material、Care Instructions、Warranty Period 等结构化属性。这些属性会显示在产品详情页上,也可用于搜索。

  4. 修饰选项(客户在购买时可配置):用于个性化定制(刻字文本、不影响库存的颜色选择)。这与变体不同——修饰选项不会生成单独的 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

评论

支持 Markdown