# データベース設計書 | 項目 | 内容 | |------|------| | 文書番号 | DB-ECOM-001 | | バージョン | 1.0 | | 作成日 | 2025年12月1日 | | ステータス | 承認済み | --- ## 1. 概要 各サービスが独自のSQLiteデータベースファイルを保有。**サービス間の外部キーなし**、**共有データベースなし**。 | サービス | DBファイル | テーブル | |---------|----------|---------| | 注文サービス | order_service.db | orders, order_items | | 決済サービス | payment_service.db | payments, refunds | | 通知サービス | notification_service.db | notification_templates, notifications | | フロントエンド管理画面 | なし | —(ステートレスSPA、データベース不使用) | --- ## 2. ER図 ```mermaid erDiagram orders { int id PK string customer_email string customer_name enum status float total_amount string currency datetime created_at datetime updated_at } order_items { int id PK int order_id FK string product_name int quantity float unit_price } payments { int id PK int order_id UK "UNIQUE" float amount string currency enum status string payment_method string transaction_id UK datetime created_at datetime updated_at } refunds { int id PK int payment_id FK float amount string reason string status datetime created_at } notification_templates { int id PK string name UK string subject_template text body_template enum channel string language } notifications { int id PK int order_id "ユニークではない" enum channel string template_name string recipient string subject text body enum status datetime sent_at datetime created_at } orders ||--o{ order_items : "明細" payments ||--o{ refunds : "返金" orders ||--|| payments : "論理参照 (order_id)" orders ||--o{ notifications : "論理参照 (order_id)" ``` --- ## 3. 注文サービスDB ### 3.1 ordersテーブル | カラム | 型 | NULL可 | デフォルト | 制約 | 備考 | |--------|-----|--------|-----------|------|------| | id | INTEGER | 不可 | auto | PRIMARY KEY | | | customer_email | VARCHAR | 不可 | | | | | customer_name | VARCHAR | 不可 | | | 日本語名対応 | | status | ENUM | 不可 | "pending" | | OrderStatus | | total_amount | FLOAT | 不可 | | | 明細合計 | | currency | VARCHAR | 不可 | "JPY" | | | | created_at | DATETIME | 不可 | now() | | UTC | | updated_at | DATETIME | 不可 | now() | | 自動更新 | > **一括操作に不足するカラム:** > - `batch_id` なし — インポートバッチの注文グループ化不可 > - `csv_source` なし — CSVファイル元の追跡不可 > - `bulk_import_group` なし — バッチ相関なし > - `import_row_number` なし — CSV行番号へのマッピング不可 ### 3.2 order_itemsテーブル | カラム | 型 | NULL可 | 制約 | |--------|-----|--------|------| | id | INTEGER | 不可 | PRIMARY KEY | | order_id | INTEGER | 不可 | FOREIGN KEY → orders.id, CASCADE | | product_name | VARCHAR | 不可 | | | quantity | INTEGER | 不可 | > 0 | | unit_price | FLOAT | 不可 | > 0 | --- ## 4. 決済サービスDB ### 4.1 paymentsテーブル | カラム | 型 | NULL可 | 制約 | 備考 | |--------|-----|--------|------|------| | id | INTEGER | 不可 | PRIMARY KEY | | | order_id | INTEGER | 不可 | **UNIQUE** | **1:1 — バッチグループ化不可** | | amount | FLOAT | 不可 | | 最低100円、最大100万円 | | currency | VARCHAR | 不可 | デフォルト "JPY" | | | status | ENUM | 不可 | | PaymentStatus | | payment_method | VARCHAR | 不可 | "credit_card" | | | transaction_id | VARCHAR | 不可 | UNIQUE | UUID | > **重要な制約:** `order_id` のUNIQUE制約により、1注文につき厳密に1件の決済レコード。`batch_id` や `payment_group_id` カラムは存在しない。 ### 4.2 refundsテーブル | カラム | 型 | NULL可 | 制約 | |--------|-----|--------|------| | id | INTEGER | 不可 | PRIMARY KEY | | payment_id | INTEGER | 不可 | FK → payments.id | | amount | FLOAT | 不可 | = payment.amount | | reason | VARCHAR | 不可 | | | status | VARCHAR | 不可 | "completed" | --- ## 5. 通知サービスDB ### 5.1 notification_templatesテーブル **シードデータ(3件):** | name | subject_template | language | |------|-----------------|----------| | ORDER_CONFIRMATION | ご注文確認 — 注文番号 #{{ order_id }} | ja | | ORDER_SHIPPED | 発送のお知らせ — 注文番号 #{{ order_id }} | ja | | ORDER_CANCELLED | ご注文キャンセルのお知らせ — 注文番号 #{{ order_id }} | ja | ### 5.2 notificationsテーブル | カラム | 型 | NULL可 | 制約 | 備考 | |--------|-----|--------|------|------| | id | INTEGER | 不可 | PRIMARY KEY | | | order_id | INTEGER | 不可 | ユニークではない | 1注文に複数通知可 | | channel | ENUM | 不可 | | EMAIL / SMS | | template_name | VARCHAR | 不可 | | | | recipient | VARCHAR | 不可 | | | | status | ENUM | 不可 | "pending" | | | sent_at | DATETIME | 可 | | 送信時刻 | > **注記:** `order_id` はユニークではない(複数通知可)。ただし、グループ送信追跡の **batch_idカラムは存在しない**。 --- ## 6. データ整合性 - **サービス間の外部キーなし。** 各サービスDBは独立。 - **結果整合性。** 決済成功後にWebhook失敗した場合、一時的なデータ不整合が発生する可能性あり。 - **論理参照。** 決済・通知テーブルの `order_id` は論理参照であり、FKでは強制していない。 --- ## 7. 一括操作に対するスキーマ制限 | テーブル | 一括操作に不足する要素 | 影響 | |---------|---------------------|------| | orders | `batch_id`, `csv_source`, `bulk_import_group`, `import_row_number` なし | バッチインポートの注文追跡不可 | | payments | `order_id` のUNIQUE制約がバッチ決済を阻害。`batch_payment_id` なし | 1注文につき1決済を個別作成する必要あり | | notifications | グループ送信の `batch_id` なし | 同一バッチの通知を関連付けできない | | (新規テーブル必要) | `import_history` テーブルが存在しない | インポート試行・進捗・成功/失敗数の追跡不可 | 一括注文インポートの追加に必要な変更: 1. **ordersテーブル:** `batch_id`(nullable)、`csv_source`、`import_row_number` カラム追加 2. **paymentsテーブル:** UNIQUE制約の見直し、またはバッチ決済テーブル新設 3. **notificationsテーブル:** `batch_id` カラム追加 4. **新規テーブル:** `import_history`(id, filename, total_rows, success_count, failure_count, status, created_at)