# データベース設計書

## 概要

本ドキュメントは、Medusaコマースプラットフォームのデータベース設計を記述したものです。Medusaは30以上のモジュラーなコマースモジュールを持つオープンソースプラットフォームであり、各モジュールは独立したエンティティを管理します。本設計書では、主要なモジュールのテーブル定義、リレーションシップ、インデックス設計について説明します。

データベースはPostgreSQLを想定しており、MikroORMのDML（Domain Modeling Language）を使用してスキーマを定義しています。

## テーブル一覧

### 商品管理モジュール（Product Module）

| テーブル名 | 対応エンティティ | 説明 |
| --- | --- | --- |
| product | Product | 商品のマスターテーブル |
| product_variant | ProductVariant | 商品バリアント（サイズ・色など）の情報 |
| product_category | ProductCategory | 商品カテゴリの階層構造 |
| product_option | ProductOption | 商品オプション（サイズ、色など） |
| product_option_value | ProductOptionValue | 商品オプションの値 |
| image | ProductImage | 商品画像 |
| product_tag | ProductTag | 商品タグ |
| product_type | ProductType | 商品タイプ |
| product_collection | ProductCollection | 商品コレクション |
| product_tags | - | 商品とタグの中間テーブル |
| product_category_product | - | 商品とカテゴリの中間テーブル |
| product_variant_option | - | バリアントとオプション値の中間テーブル |

### 注文管理モジュール（Order Module）

| テーブル名 | 対応エンティティ | 説明 |
| --- | --- | --- |
| order | Order | 注文のマスターテーブル |
| order_line_item | OrderLineItem | 注文明細 |
| order_shipping_method | OrderShippingMethod | 注文の配送方法 |
| order_address | OrderAddress | 注文の住所情報 |
| order_transaction | OrderTransaction | 注文の決済トランザクション |
| order_summary | OrderSummary | 注文サマリー |
| order_item | OrderItem | 注文アイテム |
| return | Return | 返品 |
| order_claim | OrderClaim | クレーム（返品要求） |
| order_exchange | OrderExchange | 交換 |
| order_change | OrderChange | 注文変更履歴 |

### カートモジュール（Cart Module）

| テーブル名 | 対応エンティティ | 説明 |
| --- | --- | --- |
| cart | Cart | カート情報 |
| cart_line_item | LineItem | カートの明細 |
| cart_shipping_method | ShippingMethod | カートの配送方法 |
| cart_address | Address | カートの住所情報 |

### 顧客管理モジュール（Customer Module）

| テーブル名 | 対応エンティティ | 説明 |
| --- | --- | --- |
| customer | Customer | 顧客情報 |
| customer_group | CustomerGroup | 顧客グループ |
| customer_address | CustomerAddress | 顧客住所 |
| customer_group_customer | CustomerGroupCustomer | 顧客とグループの中間テーブル |

### 決済モジュール（Payment Module）

| テーブル名 | 対応エンティティ | 説明 |
| --- | --- | --- |
| payment_collection | PaymentCollection | 決済コレクション |
| payment | Payment | 決済情報 |
| payment_session | PaymentSession | 決済セッション |
| refund | Refund | 返金情報 |
| capture | Capture | キャプチャ（売上確定） |
| payment_provider | PaymentProvider | 決済プロバイダー |

### フルフィルメントモジュール（Fulfillment Module）

| テーブル名 | 対応エンティティ | 説明 |
| --- | --- | --- |
| fulfillment | Fulfillment | フルフィルメント（出荷）情報 |
| shipping_option | ShippingOption | 配送オプション |
| fulfillment_set | FulfillmentSet | フルフィルメントセット |
| service_zone | ServiceZone | サービスゾーン |
| geo_zone | GeoZone | 地理ゾーン |
| shipping_profile | ShippingProfile | 配送プロファイル |

### プロモーションモジュール（Promotion Module）

| テーブル名 | 対応エンティティ | 説明 |
| --- | --- | --- |
| promotion | Promotion | プロモーション |
| promotion_campaign | Campaign | キャンペーン |
| campaign_budget | CampaignBudget | キャンペーン予算 |
| promotion_rule | PromotionRule | プロモーションルール |
| application_method | ApplicationMethod | 適用方法 |

### 在庫管理モジュール（Inventory Module）

| テーブル名 | 対応エンティティ | 説明 |
| --- | --- | --- |
| inventory_item | InventoryItem | 在庫アイテム |
| inventory_level | InventoryLevel | 在庫レベル（ロケーション別） |
| reservation_item | ReservationItem | 予約アイテム |

### 価格モジュール（Pricing Module）

| テーブル名 | 対応エンティティ | 説明 |
| --- | --- | --- |
| price_set | PriceSet | 価格セット |
| price | Price | 価格 |
| price_list | PriceList | 価格リスト |
| price_rule | PriceRule | 価格ルール |

### リージョンモジュール（Region Module）

| テーブル名 | 対応エンティティ | 説明 |
| --- | --- | --- |
| region | Region | リージョン |
| region_country | Country | 国マスター |

### その他のモジュール

| テーブル名 | 対応エンティティ | 説明 |
| --- | --- | --- |
| sales_channel | SalesChannel | 販売チャネル |
| stock_location | StockLocation | 在庫ロケーション |
| currency | Currency | 通貨マスター |
| user | User | 管理者ユーザー |
| tax_rate | TaxRate | 税率 |
| tax_region | TaxRegion | 税リージョン |

---

## 各テーブル定義

### 1. Product（商品）

商品の基本情報を管理するテーブルです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | VARCHAR | NO | 主キー（プレフィックス: prod） |
| title | TEXT | NO | 商品タイトル（検索可能・翻訳対応） |
| handle | TEXT | NO | URLハンドル（ユニーク） |
| subtitle | TEXT | YES | サブタイトル |
| description | TEXT | YES | 商品説明 |
| is_giftcard | BOOLEAN | NO | ギフトカードフラグ（デフォルト: false） |
| status | ENUM | NO | ステータス（draft/proposed/published/rejected） |
| thumbnail | TEXT | YES | サムネイルURL |
| weight | TEXT | YES | 重量 |
| length | TEXT | YES | 長さ |
| height | TEXT | YES | 高さ |
| width | TEXT | YES | 幅 |
| origin_country | TEXT | YES | 原産国 |
| hs_code | TEXT | YES | HSコード |
| mid_code | TEXT | YES | MIDコード |
| material | TEXT | YES | 素材（翻訳対応） |
| discountable | BOOLEAN | NO | 割引適用可否（デフォルト: true） |
| external_id | TEXT | YES | 外部ID |
| type_id | VARCHAR | YES | 商品タイプID（FK） |
| collection_id | VARCHAR | YES | コレクションID（FK） |
| metadata | JSONB | YES | メタデータ |
| created_at | TIMESTAMP | NO | 作成日時 |
| updated_at | TIMESTAMP | NO | 更新日時 |
| deleted_at | TIMESTAMP | YES | 削除日時（論理削除） |

**インデックス:**
- IDX_product_handle_unique: handle（ユニーク、deleted_at IS NULL）
- IDX_product_type_id: type_id
- IDX_product_collection_id: collection_id
- IDX_product_status: status

### 2. ProductVariant（商品バリアント）

商品のバリエーション（サイズ、色など）を管理するテーブルです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | VARCHAR | NO | 主キー（プレフィックス: variant） |
| title | TEXT | NO | バリアントタイトル |
| sku | TEXT | YES | SKU（ユニーク） |
| barcode | TEXT | YES | バーコード（ユニーク） |
| ean | TEXT | YES | EAN（ユニーク） |
| upc | TEXT | YES | UPC（ユニーク） |
| allow_backorder | BOOLEAN | NO | バックオーダー許可（デフォルト: false） |
| manage_inventory | BOOLEAN | NO | 在庫管理フラグ（デフォルト: true） |
| hs_code | TEXT | YES | HSコード |
| origin_country | TEXT | YES | 原産国 |
| mid_code | TEXT | YES | MIDコード |
| material | TEXT | YES | 素材 |
| weight | NUMERIC | YES | 重量 |
| length | NUMERIC | YES | 長さ |
| height | NUMERIC | YES | 高さ |
| width | NUMERIC | YES | 幅 |
| variant_rank | INTEGER | YES | 表示順（デフォルト: 0） |
| thumbnail | TEXT | YES | サムネイルURL |
| product_id | VARCHAR | YES | 商品ID（FK） |
| metadata | JSONB | YES | メタデータ |
| created_at | TIMESTAMP | NO | 作成日時 |
| updated_at | TIMESTAMP | NO | 更新日時 |
| deleted_at | TIMESTAMP | YES | 削除日時 |

**インデックス:**
- IDX_product_variant_id_product_id: id, product_id
- IDX_product_variant_product_id: product_id
- IDX_product_variant_sku_unique: sku（ユニーク）
- IDX_product_variant_barcode_unique: barcode（ユニーク）
- IDX_product_variant_ean_unique: ean（ユニーク）
- IDX_product_variant_upc_unique: upc（ユニーク）

### 3. ProductCategory（商品カテゴリ）

階層構造を持つ商品カテゴリを管理するテーブルです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | VARCHAR | NO | 主キー（プレフィックス: pcat） |
| name | TEXT | NO | カテゴリ名（検索可能・翻訳対応） |
| description | TEXT | NO | 説明（デフォルト: ""） |
| handle | TEXT | NO | URLハンドル（ユニーク） |
| mpath | TEXT | NO | マテリアライズドパス |
| is_active | BOOLEAN | NO | アクティブフラグ（デフォルト: false） |
| is_internal | BOOLEAN | NO | 内部カテゴリフラグ（デフォルト: false） |
| rank | INTEGER | NO | 表示順（デフォルト: 0） |
| parent_category_id | VARCHAR | YES | 親カテゴリID（FK、自己参照） |
| metadata | JSONB | YES | メタデータ |
| created_at | TIMESTAMP | NO | 作成日時 |
| updated_at | TIMESTAMP | NO | 更新日時 |
| deleted_at | TIMESTAMP | YES | 削除日時 |

**インデックス:**
- IDX_product_category_path: mpath
- IDX_category_handle_unique: handle（ユニーク）

### 4. ProductOption（商品オプション）

商品のオプション（サイズ、色など）を定義するテーブルです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | VARCHAR | NO | 主キー（プレフィックス: opt） |
| title | TEXT | NO | オプション名（検索可能・翻訳対応） |
| product_id | VARCHAR | NO | 商品ID（FK） |
| metadata | JSONB | YES | メタデータ |
| created_at | TIMESTAMP | NO | 作成日時 |
| updated_at | TIMESTAMP | NO | 更新日時 |
| deleted_at | TIMESTAMP | YES | 削除日時 |

**インデックス:**
- IDX_option_product_id_title_unique: product_id, title（複合ユニーク）

### 5. ProductOptionValue（商品オプション値）

商品オプションの具体的な値を管理するテーブルです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | VARCHAR | NO | 主キー（プレフィックス: optval） |
| value | TEXT | NO | オプション値（翻訳対応） |
| option_id | VARCHAR | YES | オプションID（FK） |
| metadata | JSONB | YES | メタデータ |
| created_at | TIMESTAMP | NO | 作成日時 |
| updated_at | TIMESTAMP | NO | 更新日時 |
| deleted_at | TIMESTAMP | YES | 削除日時 |

**インデックス:**
- IDX_option_value_option_id_unique: option_id, value（複合ユニーク）

### 6. ProductImage（商品画像）

商品画像を管理するテーブルです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | VARCHAR | NO | 主キー（プレフィックス: img） |
| url | TEXT | NO | 画像URL |
| rank | INTEGER | NO | 表示順（デフォルト: 0） |
| product_id | VARCHAR | NO | 商品ID（FK） |
| metadata | JSONB | YES | メタデータ |
| created_at | TIMESTAMP | NO | 作成日時 |
| updated_at | TIMESTAMP | NO | 更新日時 |
| deleted_at | TIMESTAMP | YES | 削除日時 |

**インデックス:**
- IDX_product_image_url: url
- IDX_product_image_rank: rank
- IDX_product_image_url_rank_product_id: url, rank, product_id
- IDX_product_image_rank_product_id: rank, product_id

### 7. ProductTag（商品タグ）

商品のタグを管理するテーブルです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | VARCHAR | NO | 主キー（プレフィックス: ptag） |
| value | TEXT | NO | タグ値（検索可能・翻訳対応・ユニーク） |
| metadata | JSONB | YES | メタデータ |
| created_at | TIMESTAMP | NO | 作成日時 |
| updated_at | TIMESTAMP | NO | 更新日時 |
| deleted_at | TIMESTAMP | YES | 削除日時 |

**インデックス:**
- IDX_tag_value_unique: value（ユニーク）

### 8. ProductType（商品タイプ）

商品タイプを管理するテーブルです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | VARCHAR | NO | 主キー（プレフィックス: ptyp） |
| value | TEXT | NO | タイプ値（検索可能・翻訳対応・ユニーク） |
| metadata | JSONB | YES | メタデータ |
| created_at | TIMESTAMP | NO | 作成日時 |
| updated_at | TIMESTAMP | NO | 更新日時 |
| deleted_at | TIMESTAMP | YES | 削除日時 |

**インデックス:**
- IDX_type_value_unique: value（ユニーク）

### 9. ProductCollection（商品コレクション）

商品コレクションを管理するテーブルです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | VARCHAR | NO | 主キー（プレフィックス: pcol） |
| title | TEXT | NO | コレクションタイトル（検索可能・翻訳対応） |
| handle | TEXT | NO | URLハンドル（ユニーク） |
| metadata | JSONB | YES | メタデータ |
| created_at | TIMESTAMP | NO | 作成日時 |
| updated_at | TIMESTAMP | NO | 更新日時 |
| deleted_at | TIMESTAMP | YES | 削除日時 |

**インデックス:**
- IDX_collection_handle_unique: handle（ユニーク）

### 10. Order（注文）

注文情報を管理するテーブルです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | VARCHAR | NO | 主キー（プレフィックス: order） |
| display_id | SERIAL | NO | 表示用ID（自動インクリメント） |
| custom_display_id | TEXT | YES | カスタム表示用ID（ユニーク） |
| region_id | VARCHAR | YES | リージョンID |
| customer_id | VARCHAR | YES | 顧客ID |
| version | INTEGER | NO | バージョン（デフォルト: 1） |
| sales_channel_id | VARCHAR | YES | 販売チャネルID |
| status | ENUM | NO | ステータス（pending/completed/archived/canceled/requires_action/draft） |
| is_draft_order | BOOLEAN | NO | ドラフト注文フラグ（デフォルト: false） |
| email | TEXT | YES | メールアドレス（検索可能） |
| currency_code | TEXT | NO | 通貨コード |
| locale | TEXT | YES | ロケール |
| no_notification | BOOLEAN | YES | 通知無効フラグ |
| shipping_address_id | VARCHAR | YES | 配送先住所ID（FK） |
| billing_address_id | VARCHAR | YES | 請求先住所ID（FK） |
| canceled_at | TIMESTAMP | YES | キャンセル日時 |
| metadata | JSONB | YES | メタデータ |
| created_at | TIMESTAMP | NO | 作成日時 |
| updated_at | TIMESTAMP | NO | 更新日時 |
| deleted_at | TIMESTAMP | YES | 削除日時 |

**インデックス:**
- IDX_order_display_id: display_id
- IDX_order_custom_display_id: custom_display_id（ユニーク）
- IDX_order_region_id: region_id
- IDX_order_customer_id: customer_id
- IDX_order_sales_channel_id: sales_channel_id
- IDX_order_currency_code: currency_code
- IDX_order_shipping_address_id: shipping_address_id
- IDX_order_billing_address_id: billing_address_id
- IDX_order_is_draft_order: is_draft_order
- IDX_order_deleted_at: deleted_at

### 11. OrderLineItem（注文明細）

注文の明細行を管理するテーブルです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | VARCHAR | NO | 主キー（プレフィックス: ordli） |
| title | TEXT | NO | 商品タイトル |
| subtitle | TEXT | YES | サブタイトル |
| thumbnail | TEXT | YES | サムネイルURL |
| variant_id | VARCHAR | YES | バリアントID |
| product_id | VARCHAR | YES | 商品ID |
| product_title | TEXT | YES | 商品タイトル |
| product_description | TEXT | YES | 商品説明 |
| product_subtitle | TEXT | YES | 商品サブタイトル |
| product_type | TEXT | YES | 商品タイプ |
| product_type_id | VARCHAR | YES | 商品タイプID |
| product_collection | TEXT | YES | 商品コレクション |
| product_handle | TEXT | YES | 商品ハンドル |
| variant_sku | TEXT | YES | バリアントSKU |
| variant_barcode | TEXT | YES | バリアントバーコード |
| variant_title | TEXT | YES | バリアントタイトル |
| variant_option_values | JSONB | YES | バリアントオプション値 |
| requires_shipping | BOOLEAN | NO | 配送要否（デフォルト: true） |
| is_giftcard | BOOLEAN | NO | ギフトカードフラグ（デフォルト: false） |
| is_discountable | BOOLEAN | NO | 割引適用可否（デフォルト: true） |
| is_tax_inclusive | BOOLEAN | NO | 税込フラグ（デフォルト: false） |
| compare_at_unit_price | NUMERIC | YES | 比較用単価 |
| unit_price | NUMERIC | YES | 単価 |
| is_custom_price | BOOLEAN | NO | カスタム価格フラグ（デフォルト: false） |
| metadata | JSONB | YES | メタデータ |
| created_at | TIMESTAMP | NO | 作成日時 |
| updated_at | TIMESTAMP | NO | 更新日時 |
| deleted_at | TIMESTAMP | YES | 削除日時 |

**インデックス:**
- IDX_order_line_item_deleted_at: deleted_at
- IDX_order_line_item_product_id: product_id
- IDX_line_item_product_type_id: product_type_id
- IDX_order_line_item_variant_id: variant_id

### 12. OrderAddress（注文住所）

注文の住所情報を管理するテーブルです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | VARCHAR | NO | 主キー（プレフィックス: ordaddr） |
| customer_id | VARCHAR | YES | 顧客ID |
| company | TEXT | YES | 会社名（検索可能） |
| first_name | TEXT | YES | 名（検索可能） |
| last_name | TEXT | YES | 姓（検索可能） |
| address_1 | TEXT | YES | 住所1（検索可能） |
| address_2 | TEXT | YES | 住所2（検索可能） |
| city | TEXT | YES | 市区町村（検索可能） |
| country_code | TEXT | YES | 国コード |
| province | TEXT | YES | 都道府県（検索可能） |
| postal_code | TEXT | YES | 郵便番号（検索可能） |
| phone | TEXT | YES | 電話番号（検索可能） |
| metadata | JSONB | YES | メタデータ |
| created_at | TIMESTAMP | NO | 作成日時 |
| updated_at | TIMESTAMP | NO | 更新日時 |
| deleted_at | TIMESTAMP | YES | 削除日時 |

**インデックス:**
- IDX_order_address_customer_id: customer_id

### 13. OrderTransaction（注文トランザクション）

注文の決済トランザクションを管理するテーブルです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | VARCHAR | NO | 主キー（プレフィックス: ordtrx） |
| version | INTEGER | NO | バージョン（デフォルト: 1） |
| amount | NUMERIC | NO | 金額 |
| currency_code | TEXT | NO | 通貨コード |
| reference | TEXT | YES | 参照情報 |
| reference_id | VARCHAR | YES | 参照ID |
| order_id | VARCHAR | NO | 注文ID（FK） |
| return_id | VARCHAR | YES | 返品ID（FK） |
| exchange_id | VARCHAR | YES | 交換ID（FK） |
| claim_id | VARCHAR | YES | クレームID（FK） |
| created_at | TIMESTAMP | NO | 作成日時 |
| updated_at | TIMESTAMP | NO | 更新日時 |
| deleted_at | TIMESTAMP | YES | 削除日時 |

**インデックス:**
- IDX_order_transaction_reference_id: reference_id
- IDX_order_transaction_order_id: order_id
- IDX_order_transaction_return_id: return_id
- IDX_order_transaction_exchange_id: exchange_id
- IDX_order_transaction_claim_id: claim_id
- IDX_order_transaction_currency_code: currency_code
- IDX_order_transaction_deleted_at: deleted_at
- IDX_order_transaction_order_id_version: order_id, version

### 14. Return（返品）

返品情報を管理するテーブルです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | VARCHAR | NO | 主キー（プレフィックス: return） |
| order_version | INTEGER | NO | 注文バージョン |
| display_id | SERIAL | NO | 表示用ID（自動インクリメント） |
| status | ENUM | NO | ステータス（open/requested/received/partially_received/canceled） |
| location_id | VARCHAR | YES | ロケーションID |
| no_notification | BOOLEAN | YES | 通知無効フラグ |
| refund_amount | NUMERIC | YES | 返金額 |
| created_by | VARCHAR | YES | 作成者 |
| order_id | VARCHAR | NO | 注文ID（FK） |
| exchange_id | VARCHAR | YES | 交換ID（FK） |
| claim_id | VARCHAR | YES | クレームID（FK） |
| requested_at | TIMESTAMP | YES | リクエスト日時 |
| received_at | TIMESTAMP | YES | 受領日時 |
| canceled_at | TIMESTAMP | YES | キャンセル日時 |
| metadata | JSONB | YES | メタデータ |
| created_at | TIMESTAMP | NO | 作成日時 |
| updated_at | TIMESTAMP | NO | 更新日時 |
| deleted_at | TIMESTAMP | YES | 削除日時 |

**インデックス:**
- IDX_return_display_id: display_id
- IDX_return_deleted_at: deleted_at
- IDX_return_order_id: order_id
- IDX_return_exchange_id: exchange_id
- IDX_return_claim_id: claim_id

### 15. Cart（カート）

カート情報を管理するテーブルです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | VARCHAR | NO | 主キー（プレフィックス: cart） |
| region_id | VARCHAR | YES | リージョンID |
| customer_id | VARCHAR | YES | 顧客ID |
| sales_channel_id | VARCHAR | YES | 販売チャネルID |
| email | TEXT | YES | メールアドレス |
| currency_code | TEXT | NO | 通貨コード |
| locale | TEXT | YES | ロケール（BCP 47形式） |
| shipping_address_id | VARCHAR | YES | 配送先住所ID（FK） |
| billing_address_id | VARCHAR | YES | 請求先住所ID（FK） |
| completed_at | TIMESTAMP | YES | 完了日時 |
| metadata | JSONB | YES | メタデータ |
| created_at | TIMESTAMP | NO | 作成日時 |
| updated_at | TIMESTAMP | NO | 更新日時 |
| deleted_at | TIMESTAMP | YES | 削除日時 |

**インデックス:**
- IDX_cart_region_id: region_id
- IDX_cart_customer_id: customer_id
- IDX_cart_sales_channel_id: sales_channel_id
- IDX_cart_curency_code: currency_code
- IDX_cart_shipping_address_id: shipping_address_id
- IDX_cart_billing_address_id: billing_address_id

### 16. CartLineItem（カート明細）

カートの明細行を管理するテーブルです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | VARCHAR | NO | 主キー（プレフィックス: cali） |
| title | TEXT | NO | 商品タイトル |
| subtitle | TEXT | YES | サブタイトル |
| thumbnail | TEXT | YES | サムネイルURL |
| quantity | INTEGER | NO | 数量 |
| variant_id | VARCHAR | YES | バリアントID |
| product_id | VARCHAR | YES | 商品ID |
| product_title | TEXT | YES | 商品タイトル |
| product_description | TEXT | YES | 商品説明 |
| product_subtitle | TEXT | YES | 商品サブタイトル |
| product_type | TEXT | YES | 商品タイプ |
| product_type_id | VARCHAR | YES | 商品タイプID |
| product_collection | TEXT | YES | 商品コレクション |
| product_handle | TEXT | YES | 商品ハンドル |
| variant_sku | TEXT | YES | バリアントSKU |
| variant_barcode | TEXT | YES | バリアントバーコード |
| variant_title | TEXT | YES | バリアントタイトル |
| variant_option_values | JSONB | YES | バリアントオプション値 |
| requires_shipping | BOOLEAN | NO | 配送要否（デフォルト: true） |
| is_discountable | BOOLEAN | NO | 割引適用可否（デフォルト: true） |
| is_giftcard | BOOLEAN | NO | ギフトカードフラグ（デフォルト: false） |
| is_tax_inclusive | BOOLEAN | NO | 税込フラグ（デフォルト: false） |
| is_custom_price | BOOLEAN | NO | カスタム価格フラグ（デフォルト: false） |
| compare_at_unit_price | NUMERIC | YES | 比較用単価 |
| unit_price | NUMERIC | NO | 単価 |
| cart_id | VARCHAR | NO | カートID（FK） |
| metadata | JSONB | YES | メタデータ |
| created_at | TIMESTAMP | NO | 作成日時 |
| updated_at | TIMESTAMP | NO | 更新日時 |
| deleted_at | TIMESTAMP | YES | 削除日時 |

**インデックス:**
- IDX_cart_line_item_cart_id: cart_id
- IDX_line_item_variant_id: variant_id
- IDX_line_item_product_id: product_id
- IDX_line_item_product_type_id: product_type_id

### 17. Customer（顧客）

顧客情報を管理するテーブルです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | VARCHAR | NO | 主キー（プレフィックス: cus） |
| company_name | TEXT | YES | 会社名（検索可能） |
| first_name | TEXT | YES | 名（検索可能） |
| last_name | TEXT | YES | 姓（検索可能） |
| email | TEXT | YES | メールアドレス（検索可能） |
| phone | TEXT | YES | 電話番号（検索可能） |
| has_account | BOOLEAN | NO | アカウント保有フラグ（デフォルト: false） |
| created_by | VARCHAR | YES | 作成者 |
| metadata | JSONB | YES | メタデータ |
| created_at | TIMESTAMP | NO | 作成日時 |
| updated_at | TIMESTAMP | NO | 更新日時 |
| deleted_at | TIMESTAMP | YES | 削除日時 |

**インデックス:**
- (email, has_account) - ユニーク複合インデックス

### 18. CustomerGroup（顧客グループ）

顧客グループを管理するテーブルです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | VARCHAR | NO | 主キー（プレフィックス: cusgroup） |
| name | TEXT | NO | グループ名（検索可能・翻訳対応・ユニーク） |
| created_by | VARCHAR | YES | 作成者 |
| metadata | JSONB | YES | メタデータ |
| created_at | TIMESTAMP | NO | 作成日時 |
| updated_at | TIMESTAMP | NO | 更新日時 |
| deleted_at | TIMESTAMP | YES | 削除日時 |

**インデックス:**
- name（ユニーク）

### 19. CustomerAddress（顧客住所）

顧客の住所を管理するテーブルです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | VARCHAR | NO | 主キー（プレフィックス: cuaddr） |
| address_name | TEXT | YES | 住所名（検索可能） |
| is_default_shipping | BOOLEAN | NO | デフォルト配送先（デフォルト: false） |
| is_default_billing | BOOLEAN | NO | デフォルト請求先（デフォルト: false） |
| company | TEXT | YES | 会社名（検索可能） |
| first_name | TEXT | YES | 名（検索可能） |
| last_name | TEXT | YES | 姓（検索可能） |
| address_1 | TEXT | YES | 住所1（検索可能） |
| address_2 | TEXT | YES | 住所2（検索可能） |
| city | TEXT | YES | 市区町村（検索可能） |
| country_code | TEXT | YES | 国コード |
| province | TEXT | YES | 都道府県（検索可能） |
| postal_code | TEXT | YES | 郵便番号（検索可能） |
| phone | TEXT | YES | 電話番号 |
| customer_id | VARCHAR | NO | 顧客ID（FK） |
| metadata | JSONB | YES | メタデータ |
| created_at | TIMESTAMP | NO | 作成日時 |
| updated_at | TIMESTAMP | NO | 更新日時 |
| deleted_at | TIMESTAMP | YES | 削除日時 |

**インデックス:**
- IDX_customer_address_unique_customer_billing: customer_id（is_default_billing = true の場合ユニーク）
- IDX_customer_address_unique_customer_shipping: customer_id（is_default_shipping = true の場合ユニーク）

### 20. PaymentCollection（決済コレクション）

決済コレクションを管理するテーブルです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | VARCHAR | NO | 主キー（プレフィックス: pay_col） |
| currency_code | TEXT | NO | 通貨コード |
| amount | NUMERIC | NO | 金額 |
| authorized_amount | NUMERIC | YES | オーソリ済み金額 |
| captured_amount | NUMERIC | YES | キャプチャ済み金額 |
| refunded_amount | NUMERIC | YES | 返金済み金額 |
| status | ENUM | NO | ステータス（not_paid/awaiting/authorized/partially_authorized/captured/canceled/refunded） |
| completed_at | TIMESTAMP | YES | 完了日時 |
| metadata | JSONB | YES | メタデータ |
| created_at | TIMESTAMP | NO | 作成日時 |
| updated_at | TIMESTAMP | NO | 更新日時 |
| deleted_at | TIMESTAMP | YES | 削除日時 |

### 21. Payment（決済）

決済情報を管理するテーブルです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | VARCHAR | NO | 主キー（プレフィックス: pay） |
| amount | NUMERIC | NO | 金額 |
| currency_code | TEXT | NO | 通貨コード |
| provider_id | VARCHAR | NO | プロバイダーID |
| payment_collection_id | VARCHAR | NO | 決済コレクションID（FK） |
| payment_session_id | VARCHAR | NO | 決済セッションID（FK） |
| data | JSONB | YES | プロバイダー固有データ |
| captured_at | TIMESTAMP | YES | キャプチャ日時 |
| canceled_at | TIMESTAMP | YES | キャンセル日時 |
| metadata | JSONB | YES | メタデータ |
| created_at | TIMESTAMP | NO | 作成日時 |
| updated_at | TIMESTAMP | NO | 更新日時 |
| deleted_at | TIMESTAMP | YES | 削除日時 |

**インデックス:**
- IDX_payment_provider_id: provider_id
- IDX_payment_payment_collection_id: payment_collection_id
- IDX_payment_payment_session_id: payment_session_id

### 22. PaymentSession（決済セッション）

決済セッションを管理するテーブルです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | VARCHAR | NO | 主キー（プレフィックス: payses） |
| currency_code | TEXT | NO | 通貨コード |
| amount | NUMERIC | NO | 金額 |
| provider_id | VARCHAR | NO | プロバイダーID |
| data | JSONB | NO | プロバイダー固有データ（デフォルト: {}） |
| context | JSONB | YES | コンテキスト情報 |
| status | ENUM | NO | ステータス（pending/requires_more/authorized/captured/canceled/error） |
| authorized_at | TIMESTAMP | YES | オーソリ日時 |
| payment_collection_id | VARCHAR | NO | 決済コレクションID（FK） |
| metadata | JSONB | YES | メタデータ |
| created_at | TIMESTAMP | NO | 作成日時 |
| updated_at | TIMESTAMP | NO | 更新日時 |
| deleted_at | TIMESTAMP | YES | 削除日時 |

**インデックス:**
- IDX_payment_session_payment_collection_id: payment_collection_id

### 23. InventoryItem（在庫アイテム）

在庫アイテムを管理するテーブルです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | VARCHAR | NO | 主キー（プレフィックス: iitem） |
| sku | TEXT | YES | SKU（検索可能・ユニーク） |
| origin_country | TEXT | YES | 原産国 |
| hs_code | TEXT | YES | HSコード（検索可能） |
| mid_code | TEXT | YES | MIDコード（検索可能） |
| material | TEXT | YES | 素材 |
| weight | NUMERIC | YES | 重量 |
| length | NUMERIC | YES | 長さ |
| height | NUMERIC | YES | 高さ |
| width | NUMERIC | YES | 幅 |
| requires_shipping | BOOLEAN | NO | 配送要否（デフォルト: true） |
| description | TEXT | YES | 説明（検索可能） |
| title | TEXT | YES | タイトル（検索可能） |
| thumbnail | TEXT | YES | サムネイルURL |
| metadata | JSONB | YES | メタデータ |
| created_at | TIMESTAMP | NO | 作成日時 |
| updated_at | TIMESTAMP | NO | 更新日時 |
| deleted_at | TIMESTAMP | YES | 削除日時 |

**インデックス:**
- IDX_inventory_item_sku: sku（ユニーク）

### 24. InventoryLevel（在庫レベル）

ロケーション別の在庫レベルを管理するテーブルです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | VARCHAR | NO | 主キー（プレフィックス: ilev） |
| location_id | VARCHAR | NO | ロケーションID |
| inventory_item_id | VARCHAR | NO | 在庫アイテムID（FK） |
| stocked_quantity | NUMERIC | NO | 在庫数量（デフォルト: 0） |
| reserved_quantity | NUMERIC | NO | 予約数量（デフォルト: 0） |
| incoming_quantity | NUMERIC | NO | 入荷予定数量（デフォルト: 0） |
| metadata | JSONB | YES | メタデータ |
| created_at | TIMESTAMP | NO | 作成日時 |
| updated_at | TIMESTAMP | NO | 更新日時 |
| deleted_at | TIMESTAMP | YES | 削除日時 |

**インデックス:**
- IDX_inventory_level_inventory_item_id: inventory_item_id
- IDX_inventory_level_location_id: location_id
- IDX_inventory_level_location_id_inventory_item_id: inventory_item_id, location_id（ユニーク）

### 25. Region（リージョン）

リージョンを管理するテーブルです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | VARCHAR | NO | 主キー（プレフィックス: reg） |
| name | TEXT | NO | リージョン名（検索可能・翻訳対応） |
| currency_code | TEXT | NO | 通貨コード（検索可能） |
| automatic_taxes | BOOLEAN | NO | 自動税計算（デフォルト: true） |
| metadata | JSONB | YES | メタデータ |
| created_at | TIMESTAMP | NO | 作成日時 |
| updated_at | TIMESTAMP | NO | 更新日時 |
| deleted_at | TIMESTAMP | YES | 削除日時 |

### 26. Country（国）

国マスターを管理するテーブルです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| iso_2 | TEXT | NO | ISO 3166-1 alpha-2 コード（主キー） |
| iso_3 | TEXT | NO | ISO 3166-1 alpha-3 コード |
| num_code | TEXT | NO | ISO 3166-1 numeric コード |
| name | TEXT | NO | 国名（検索可能） |
| display_name | TEXT | NO | 表示名 |
| region_id | VARCHAR | YES | リージョンID（FK） |
| metadata | JSONB | YES | メタデータ |
| created_at | TIMESTAMP | NO | 作成日時 |
| updated_at | TIMESTAMP | NO | 更新日時 |
| deleted_at | TIMESTAMP | YES | 削除日時 |

**インデックス:**
- (region_id, iso_2) - ユニーク複合インデックス

### 27. Promotion（プロモーション）

プロモーションを管理するテーブルです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | VARCHAR | NO | 主キー（プレフィックス: promo） |
| code | TEXT | NO | プロモーションコード（検索可能・ユニーク） |
| is_automatic | BOOLEAN | NO | 自動適用フラグ（デフォルト: false） |
| is_tax_inclusive | BOOLEAN | NO | 税込フラグ（デフォルト: false） |
| limit | INTEGER | YES | 利用上限 |
| used | INTEGER | NO | 利用回数（デフォルト: 0） |
| type | ENUM | NO | タイプ（standard/buyget） |
| status | ENUM | NO | ステータス（draft/active/inactive/scheduled/expired） |
| campaign_id | VARCHAR | YES | キャンペーンID（FK） |
| metadata | JSONB | YES | メタデータ |
| created_at | TIMESTAMP | NO | 作成日時 |
| updated_at | TIMESTAMP | NO | 更新日時 |
| deleted_at | TIMESTAMP | YES | 削除日時 |

**インデックス:**
- IDX_unique_promotion_code: code（ユニーク）
- IDX_promotion_type: type
- IDX_promotion_status: status
- IDX_promotion_is_automatic: is_automatic

### 28. SalesChannel（販売チャネル）

販売チャネルを管理するテーブルです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | VARCHAR | NO | 主キー（プレフィックス: sc） |
| name | TEXT | NO | チャネル名（検索可能） |
| description | TEXT | YES | 説明（検索可能） |
| is_disabled | BOOLEAN | NO | 無効フラグ（デフォルト: false） |
| metadata | JSONB | YES | メタデータ |
| created_at | TIMESTAMP | NO | 作成日時 |
| updated_at | TIMESTAMP | NO | 更新日時 |
| deleted_at | TIMESTAMP | YES | 削除日時 |

### 29. User（管理者ユーザー）

管理者ユーザーを管理するテーブルです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | VARCHAR | NO | 主キー（プレフィックス: user） |
| first_name | TEXT | YES | 名（検索可能） |
| last_name | TEXT | YES | 姓（検索可能） |
| email | TEXT | NO | メールアドレス（検索可能・ユニーク） |
| avatar_url | TEXT | YES | アバターURL |
| metadata | JSONB | YES | メタデータ |
| created_at | TIMESTAMP | NO | 作成日時 |
| updated_at | TIMESTAMP | NO | 更新日時 |
| deleted_at | TIMESTAMP | YES | 削除日時 |

**インデックス:**
- email（ユニーク）

### 30. Currency（通貨）

通貨マスターを管理するテーブルです。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| code | TEXT | NO | 通貨コード（主キー・検索可能） |
| symbol | TEXT | NO | 通貨記号 |
| symbol_native | TEXT | NO | ネイティブ通貨記号 |
| name | TEXT | NO | 通貨名（検索可能） |
| decimal_digits | INTEGER | NO | 小数桁数（デフォルト: 0） |
| rounding | NUMERIC | NO | 丸め（デフォルト: 0） |
| created_at | TIMESTAMP | NO | 作成日時 |
| updated_at | TIMESTAMP | NO | 更新日時 |
| deleted_at | TIMESTAMP | YES | 削除日時 |

---

## 備考

### 共通カラム

全てのテーブルには以下の共通カラムが含まれます（一部のマスターテーブルを除く）：

- **id**: 各テーブル固有のプレフィックスを持つ文字列型の主キー
- **created_at**: レコード作成日時（自動設定）
- **updated_at**: レコード更新日時（自動更新）
- **deleted_at**: 論理削除日時（NULL の場合はアクティブ）
- **metadata**: 拡張用のJSONBカラム

### IDプレフィックス

各テーブルのIDは以下のプレフィックスを使用します：

| エンティティ | プレフィックス |
| --- | --- |
| Product | prod |
| ProductVariant | variant |
| ProductCategory | pcat |
| ProductOption | opt |
| ProductOptionValue | optval |
| ProductImage | img |
| ProductTag | ptag |
| ProductType | ptyp |
| ProductCollection | pcol |
| Order | order |
| OrderLineItem | ordli |
| OrderAddress | ordaddr |
| OrderTransaction | ordtrx |
| Return | return |
| Cart | cart |
| CartLineItem | cali |
| Customer | cus |
| CustomerGroup | cusgroup |
| CustomerAddress | cuaddr |
| PaymentCollection | pay_col |
| Payment | pay |
| PaymentSession | payses |
| InventoryItem | iitem |
| InventoryLevel | ilev |
| Region | reg |
| Promotion | promo |
| SalesChannel | sc |
| User | user |

### ソフトデリート

全てのテーブルはソフトデリート（論理削除）を採用しており、`deleted_at` カラムに削除日時が設定されます。ユニークインデックスは `deleted_at IS NULL` の条件付きで設定されており、論理削除されたレコードを除外した上でユニーク制約が適用されます。

### 翻訳対応

以下のカラムは多言語対応（翻訳可能）として設計されています：

- Product: title, subtitle, description, material
- ProductVariant: title, material
- ProductCategory: name, description
- ProductOption: title
- ProductOptionValue: value
- ProductTag: value
- ProductType: value
- ProductCollection: title
- CustomerGroup: name
- Region: name
- ShippingOption: name

### カスケード削除

親レコードの削除時に子レコードも自動的に削除されるカスケード設定が行われています。詳細は各モデルの `cascades.delete` 設定を参照してください。
