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. 04PIMや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

中核となる構造:

  • 商品:タイトル、説明、販売元、商品タイプ、タグ、画像
  • オプション:最大 3 個(例:サイズ、色、素材)— バリエーションの軸を定義します
  • バリエーション:オプション値の組み合わせごとに 1 つ — それぞれに独自の価格、SKU、在庫、重量があります
  • メタフィールド:商品またはバリエーションごとのカスタムデータ(例:お手入れ方法、サイズガイドの URL、技術仕様)

モデリング上の判断:

  1. 商品とバリエーション:顧客が 1 つのページでオプションを並べて比較する場合は、単一の商品レコードにまとめます。名前が同じでも根本的に異なる商品には、別々の商品レコードを作成します。

  2. オプション名:Shopify では商品ごとに最大 3 個のオプションに制限されています。それ以上必要な場合(例:サイズ + 色 + 素材 + 長さ)は、2 つのオプションを組み合わせる(例:「サイズ/幅」)か、4 つ目の要素にメタフィールドを使用してください。

  3. カスタム属性のメタフィールド:設定 → カスタムデータ → 商品に移動して、メタフィールドの定義を作成します。次のような属性にはメタフィールドを使用してください。

    • 価格や在庫に影響しない属性(それらはバリエーションに設定します)
    • 商品固有のカスタムデータ(お手入れ方法、認証、寸法)
    • テーマで表示する必要がある属性、または検索アプリでフィルタリングする属性
  4. 商品タイプとタグ:主な商品カテゴリー(例:「ドレス」、「ランニングシューズ」)には product_type を使用し、複数のカテゴリーにまたがる属性(例:color-navy、occasion-formal、material-cotton)には tags を使用します。

シャツの商品構造の例:

  • 商品:「オーガニックコットン T シャツ」
  • オプション:サイズ(XS、S、M、L、XL)、色(ホワイト、ブラック、ネイビー)
  • バリエーション:15 通りの組み合わせ(5 サイズ × 3 色)。それぞれに SKU と在庫があります
  • メタフィールド:care_instructions、material_weight_gsm、sustainability_cert

Matrixify によるフィールドの一括更新:

  • 商品をエクスポートして、サポートされているすべての列を確認します
  • スプレッドシートで編集し、再インポートして、メタフィールドを含む任意のフィールドを一括更新します

WooCommerce

商品タイプ:

  • Simple:SKU と価格が 1 つずつです。バリエーションのない商品に使用します
  • Variable:属性に基づく複数のバリエーションがあります。サイズ、色などがある商品に使用します
  • Grouped:複数のシンプル商品をまとめて表示します。関連商品に使用します
  • External/Affiliate:外部 URL にリンクします。アフィリエイト商品に使用します
  • Virtual:配送がありません。サービスやサブスクリプションに使用します
  • Downloadable:デジタル商品です

属性とバリエーション:

  1. Products → Attributes に移動し、グローバル属性(すべての商品で共有)を定義します:

    • 属性を追加します:値が Red、Blue、Black、White の Color
    • 属性を追加します:値が XS、S、M、L、XL の Size
    • 属性を閲覧可能にするには、Enable archives にチェックを入れます
  2. Variable 商品で Attributes tab に移動します:

    • グローバル属性を選択し、この商品に適用する値にチェックを入れます
    • Variations tab に移動し、すべての組み合わせからバリエーションを生成します
  3. バリエーションごとの設定:各バリエーションに固有の価格、SKU、在庫、画像、重量を設定します

カスタムフィールド(商品メタデータ):

バリエーションではない属性(技術仕様、認証など)には、次の方法を使用します:

  • Attributes tab の WooCommerce 組み込みの Custom Attributes(バリエーション以外の属性)を使用します
  • より構造化されたカスタムフィールド管理には、Advanced Custom Fields (ACF) をインストールします
  • 顧客入力フィールド(刻印、パーソナライズなど)には、Product Add-Ons をインストールします

商品間の関連付け(組み込み):

  • アップセル:Linked Products tab → Upsells に移動します。商品ページに表示されます
  • クロスセル:カートに表示されます。Linked Products tab → Cross-sells で追加します
  • グループ商品:Grouped 商品タイプを使用して、関連するシンプル商品をリンクします

BigCommerce

基本構造:

  • 商品:タイトル、説明、ブランド、カテゴリー、重量、画像
  • オプション:バリエーションの軸(サイズ、色、素材)を定義します
  • オプションセット:複数の商品に割り当てられる、再利用可能なオプションのグループです
  • バリエーション(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 を生成しません。


Custom / Headless

ヘッドレスストアフロントでは、商品・オプション・バリエーションのパターンを中心に基本スキーマを設計します:

-- 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 を高めるために設定しましょう。

アップセル:顧客が閲覧している商品より高価格の商品 — 商品詳細ページに表示されます

  • 「標準バージョンをご覧いただいています。あと $20 で Pro にアップグレードできます」

クロスセル:関連商品 — カートに表示されます

  • 「この商品と一緒に、こちらのアクセサリーも購入されています」

関連商品:価格帯が近い類似商品 — 商品詳細ページの下部に表示されます

  • 「こちらの商品もおすすめです」

Shopify の場合:Products → [Product] → More details セクションで設定します。または、クロスセルアプリを使用しておすすめを自動化します。

WooCommerce の場合:各商品の Linked Products タブで設定します。

ベストプラクティス

  • カスタム構築では価格を整数(セント)で保存します — $29.99 を 2999 として保存すれば、浮動小数点の丸め誤差をなくせます
  • 商品とバリエーションは必ず分けます — バリエーションが 1 つだけの商品でも、カートや注文のロジックを統一するために、バリエーションの行を 1 つ作成します
  • URL にはスラッグ、内部参照には ID を使います — スラッグは SEO に適した人間が読みやすい形式で、UUID は列挙攻撃を防ぎます
  • 絞り込みには、商品を分けるのではなく商品タイプとタグを使います — 「青いドレス」と「赤いドレス」は別商品ではなく、バリエーションにします
  • バリエーションに関係しないデータにはメタフィールド/カスタムフィールドを使います — 価格や在庫に影響しない属性は、バリエーションではなくメタフィールドに登録します
  • 公開前にバリエーションの組み合わせをテストします — 購入可能なすべての組み合わせが、ストアフロントのバリエーション選択欄に正しく表示されることを確認します

よくある落とし穴

問題解決策
バリエーションの増えすぎ(カラー 5 種類 × サイズ 8 種類 × 素材 3 種類 = 120 バリエーション)Shopify では 1 商品あたりのバリエーション数が 100 件に制限されています。ほとんどの組み合わせを別々に在庫として持たない場合は、3 つ目の選択軸にメタフィールドを使うことを検討してください
商品検索にカスタム属性が表示されないShopify の場合:テーマまたは検索アプリの設定でメタフィールドを検索可能にします。WooCommerce の場合:インデックス対象にする属性で「Used for variations」を有効にします
カタログ全体で商品タイプとタグに一貫性がないインポート前に商品タイプとタグの統制語彙を定めます。Matrixify または WP All Import を使って一括で標準化します
サイズ/カラーを選択してもバリエーション画像が切り替わらないプラットフォームの管理画面で、バリエーションごとに画像を割り当てます。切り替えを実行するには、商品単位の画像だけでなく、バリエーションごとの画像が必要です

関連スキル

  • @variant-matrix
  • @catalog-import-export
  • @product-categorization
  • @product-content-enrichment

コメント