product-data-modeling について
Shopify、WooCommerce、BigCommerceや独自のヘッドレスストアを扱う開発者向けの商品データモデリングスキルです。商品、バリエーション、属性、関連付けの設計を支援し、カタログのデータ不備やインポート失敗を防ぎます。
主な機能
- 01各プラットフォームの商品モデルの整理
- 02商品とバリエーションの構造設計
- 03カスタム属性とフィルターの計画
- 04商品の関連付けの設計
- 05カタログのインポートと一括更新の案内
活用シーン
- 01新規ストアのカタログ構造の計画
- 02サイズや色のバリエーション追加
- 03絞り込み用カスタム属性の設定
- 04PIMや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
中核となる構造:
- 商品:タイトル、説明、販売元、商品タイプ、タグ、画像
- オプション:最大 3 個(例:サイズ、色、素材)— バリエーションの軸を定義します
- バリエーション:オプション値の組み合わせごとに 1 つ — それぞれに独自の価格、SKU、在庫、重量があります
- メタフィールド:商品またはバリエーションごとのカスタムデータ(例:お手入れ方法、サイズガイドの URL、技術仕様)
モデリング上の判断:
-
商品とバリエーション:顧客が 1 つのページでオプションを並べて比較する場合は、単一の商品レコードにまとめます。名前が同じでも根本的に異なる商品には、別々の商品レコードを作成します。
-
オプション名:Shopify では商品ごとに最大 3 個のオプションに制限されています。それ以上必要な場合(例:サイズ + 色 + 素材 + 長さ)は、2 つのオプションを組み合わせる(例:「サイズ/幅」)か、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:デジタル商品です
属性とバリエーション:
-
Products → Attributes に移動し、グローバル属性(すべての商品で共有)を定義します:
- 属性を追加します:値が Red、Blue、Black、White の Color
- 属性を追加します:値が XS、S、M、L、XL の Size
- 属性を閲覧可能にするには、Enable archives にチェックを入れます
-
Variable 商品で Attributes tab に移動します:
- グローバル属性を選択し、この商品に適用する値にチェックを入れます
- Variations tab に移動し、すべての組み合わせからバリエーションを生成します
-
バリエーションごとの設定:各バリエーションに固有の価格、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、価格調整、重量、在庫があります
- カスタムフィールド:追加の商品データ用の自由形式の名前と値のペアです
モデリングに関する判断:
-
Products → Option Sets に移動し、再利用可能なオプションセット(例:XS–3XL の「Clothing Sizes」)を作成します。商品ごとにオプションを作り直すのではなく、同じセットを複数の商品に割り当てます。
-
バリエーション数が多い商品の場合:BigCommerce は商品ごとに最大 600 SKU をサポートします。バリエーションごとに個別の価格を設定する代わりに、Bulk Pricing を使用してバリエーショングループに適用する価格ルールを設定します。
-
カスタムフィールド:Products → [Product] → Custom Fields tab に移動し、
Material、Care Instructions、Warranty Periodなどの構造化された属性を追加します。これらは商品詳細ページに表示され、検索にも使用できます。 -
モディファイアオプション(購入時に顧客が設定可能):パーソナライズ(刻印するテキスト、在庫に影響しない色の選択など)に使用します。バリエーションとは異なり、モディファイアは個別の 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