yodogawa 2.1.3 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/CHANGELOG.md +140 -94
  2. package/LICENSE +1 -1
  3. package/README.md +362 -263
  4. package/bin/checks/id-trace.js +137 -0
  5. package/bin/checks/links.js +59 -0
  6. package/bin/checks/placeholder.js +132 -0
  7. package/bin/checks/structure.js +127 -0
  8. package/bin/cli.js +51 -67
  9. package/bin/commands/doctor.js +128 -0
  10. package/bin/commands/install.js +58 -0
  11. package/bin/commands/new-task.js +117 -0
  12. package/bin/lib/check-cli.js +19 -0
  13. package/bin/lib/findings.js +31 -0
  14. package/bin/lib/markdown.js +103 -0
  15. package/bin/lib/project-spec.js +138 -0
  16. package/bin/lib/walk-md.js +23 -0
  17. package/package.json +68 -55
  18. package/skills/a-001-setup-doc-structure/SKILL.md +68 -68
  19. package/skills/a-001-setup-doc-structure/reference/directory-structure.md +75 -75
  20. package/skills/a-002-initialize-project/SKILL.md +145 -118
  21. package/skills/a-002-initialize-project/reference/hearing-questions.md +91 -41
  22. package/skills/a-002-initialize-project/reference/structure-check.md +12 -22
  23. package/skills/a-002a-slice-mvp-scope/SKILL.md +105 -0
  24. package/skills/a-002b-define-user-stories/SKILL.md +80 -0
  25. package/skills/a-002b-define-user-stories/reference/user-stories-guide.md +78 -0
  26. package/skills/a-003-create-scenarios/SKILL.md +97 -96
  27. package/{templates/project/02-behavior/01-scenarios.md → skills/a-003-create-scenarios/reference/detailed-gherkin-template.md} +413 -406
  28. package/skills/a-003-create-scenarios/reference/structure-check.md +20 -17
  29. package/skills/a-004-define-domain-model/SKILL.md +107 -98
  30. package/skills/a-004-define-domain-model/reference/event-storming-guide.md +33 -7
  31. package/skills/a-004-define-domain-model/reference/ubiquitous-language-guide.md +49 -0
  32. package/skills/a-005-create-domain-diagram/SKILL.md +18 -17
  33. package/skills/a-006-review-requirements-domain/SKILL.md +79 -29
  34. package/skills/a-006-review-requirements-domain/examples/review-report-template.md +40 -25
  35. package/skills/a-006-review-requirements-domain/reference/consistency-checks.md +67 -24
  36. package/skills/a-007-define-tech-stack/SKILL.md +99 -99
  37. package/skills/a-008-define-repository-structure/SKILL.md +96 -96
  38. package/skills/a-009-define-screen-design/SKILL.md +103 -103
  39. package/skills/a-010-define-design-system/SKILL.md +130 -130
  40. package/skills/a-011-define-data-model/SKILL.md +118 -118
  41. package/skills/a-012-define-api-spec/SKILL.md +105 -105
  42. package/skills/a-013-define-architecture/SKILL.md +98 -98
  43. package/skills/a-014-define-infrastructure/SKILL.md +118 -110
  44. package/skills/{a-002-initialize-project → a-014-define-infrastructure}/examples/nfr-baseline.md +2 -1
  45. package/{templates/project/01-requirements/04-non-functional-requirements.md → skills/a-014-define-infrastructure/examples/non-functional-requirements.md} +120 -115
  46. package/skills/a-015-review-design/SKILL.md +15 -11
  47. package/skills/a-015-review-design/examples/review-report-template.md +17 -29
  48. package/skills/a-015-review-design/reference/consistency-checks.md +5 -3
  49. package/skills/b-001-create-task-directory/SKILL.md +68 -68
  50. package/skills/b-002-create-task-definition/SKILL.md +114 -114
  51. package/skills/b-003-create-task-research/SKILL.md +130 -128
  52. package/skills/b-004-create-task-implementation/SKILL.md +98 -98
  53. package/skills/b-005-review-task/SKILL.md +40 -24
  54. package/skills/b-005-review-task/examples/review-report-template.md +25 -35
  55. package/skills/b-005-review-task/reference/assessment-criteria.md +79 -79
  56. package/skills/b-005-review-task/reference/consistency-checks.md +70 -11
  57. package/skills/c-001-implement-task/SKILL.md +186 -186
  58. package/skills/c-001-implement-task/reference/implementation-loop.md +65 -65
  59. package/skills/c-002-update-documentation/SKILL.md +159 -159
  60. package/skills/c-002-update-documentation/examples/project-doc-updates.md +4 -4
  61. package/skills/c-002-update-documentation/reference/doc-structure-and-checks.md +99 -97
  62. package/skills/d-001-review-retrospective/SKILL.md +93 -0
  63. package/skills/d-001-review-retrospective/examples/retrospective-report-template.md +50 -0
  64. package/skills/d-001-review-retrospective/reference/friction-point-mapping.md +30 -0
  65. package/templates/LESSONS.md +15 -0
  66. package/templates/project/01-requirements/01-product-brief.md +186 -0
  67. package/templates/project/01-requirements/02-mvp-scope.md +64 -0
  68. package/templates/project/01-requirements/03-parking-lot.md +29 -0
  69. package/templates/project/01-requirements/05-user-stories.md +28 -124
  70. package/templates/project/01-requirements/{02-features-implemented.md → 06-features-implemented.md} +77 -73
  71. package/templates/project/02-behavior/01-core-scenarios.md +80 -0
  72. package/templates/project/03-domain/01-domain-model.md +120 -339
  73. package/templates/project/03-domain/01-domain-sketch.md +90 -0
  74. package/templates/project/03-domain/02-ubiquitous-language.md +32 -153
  75. package/templates/project/04-design/01-tech-stack.md +367 -367
  76. package/templates/project/04-design/02-repository-structure.md +391 -391
  77. package/templates/project/04-design/03-screen-design.md +596 -596
  78. package/templates/project/04-design/04-design-system.md +261 -261
  79. package/templates/project/04-design/05-data-model.md +211 -211
  80. package/templates/project/04-design/06-api-spec.md +226 -226
  81. package/templates/project/04-design/07-architecture.md +183 -183
  82. package/templates/project/04-design/08-infrastructure.md +180 -180
  83. package/templates/project/AI_CONTEXT.md +55 -0
  84. package/templates/project/STAKEHOLDER-SUMMARY.md +66 -0
  85. package/templates/tasks/task-template/a-definition.md +143 -143
  86. package/templates/tasks/task-template/b-research.md +185 -185
  87. package/templates/tasks/task-template/c-implementation.md +200 -200
  88. package/templates/project/01-requirements/01-system-overview.md +0 -49
  89. package/templates/project/01-requirements/03-features-planned.md +0 -75
@@ -1,211 +1,211 @@
1
- # データモデル(ERD)
2
-
3
- <!--
4
- 何を書くか: データベース構造、エンティティ、属性、リレーションシップ、制約
5
-
6
- 目的:
7
- - データ構造の全体像を可視化
8
- - テーブル設計の一貫性を保つ
9
- - 開発者間の認識統一
10
- - データの整合性ルールを明確化
11
- - マイグレーション計画の基盤
12
-
13
- 重要性:
14
- - データベース設計の記録(ADR: Architecture Decision Record の一部)
15
- - 正規化・非正規化の判断根拠を記録
16
- - パフォーマンス最適化の指針
17
- - データ整合性の担保
18
- - 将来の拡張性を考慮した設計
19
-
20
- 記載のポイント:
21
- - Mermaid ERD で視覚的に表現
22
- - エンティティごとに責務を明確化
23
- - リレーションシップと多重度を正確に記載
24
- - 制約(NOT NULL, UNIQUE, CHECK)を明記
25
- - インデックス戦略を記録
26
- - データ型の選択理由を記載
27
-
28
- 更新頻度:
29
- - プロジェクト初期にドメインモデルから作成
30
- - テーブル追加・変更時に更新
31
- - マイグレーション実行時に更新
32
- - パフォーマンスチューニング時に見直し
33
- -->
34
-
35
- ---
36
-
37
- ## エンティティ一覧
38
-
39
- <!--
40
- 各エンティティの責務と主要属性を明記
41
-
42
- まずエンティティの一覧を把握してから、ERDで視覚化する流れが自然です。
43
-
44
- テーブル構成:
45
- 【エンティティ名】
46
- - テーブル名(物理名)
47
- - 複数形推奨(例: users, orders, products)
48
- - スネークケース推奨(例: order_items, user_roles)
49
-
50
- 【説明】
51
- - そのエンティティが表現するビジネス概念
52
- - 責務と役割
53
- - ドメインモデルとの対応
54
-
55
- 【主要属性】
56
- - 重要なカラムをリスト化
57
- - すべてを列挙する必要はない(詳細は ERD 参照)
58
- - ビジネスキーとなる属性を優先的に記載
59
-
60
- 【備考】
61
- - 正規化・非正規化の判断理由
62
- - パーティショニング戦略
63
- - 削除方法(論理削除 or 物理削除)
64
- - 監査要件(作成日時、更新日時、削除日時)
65
-
66
- 記載のベストプラクティス:
67
- - エンティティの分類を明記(コア、参照、関連、履歴)
68
- - ソフトデリート(論理削除)の有無を記載
69
- - タイムスタンプ(created_at, updated_at)の有無
70
- - ドメインモデルの Aggregate との対応を記載
71
-
72
- よくあるエンティティの分類:
73
- - コアエンティティ: ビジネスの中心(User, Order, Product)
74
- - 参照エンティティ: マスタデータ(Category, Status, Country)
75
- - 関連エンティティ: 多対多の中間テーブル(UserRole, OrderItem)
76
- - 履歴エンティティ: 監査ログ、変更履歴(AuditLog, OrderHistory)
77
- -->
78
-
79
- | エンティティ名 | 説明 | 主要属性 | 備考 |
80
- |---------------|------|----------|------|
81
- | <!-- 例: users --> | <!-- 例: ユーザー情報を管理。システムにアクセスする全てのユーザーを表す --> | <!-- 例: id, email, name, password_hash --> | <!-- 例: 論理削除(deleted_at)、email は一意制約 --> |
82
- | <!-- 例: orders --> | <!-- 例: 注文情報を管理。ユーザーが商品を購入する取引単位 --> | <!-- 例: id, user_id, status, total_amount --> | <!-- 例: status は enum 型または CHECK 制約、物理削除不可(履歴保持) --> |
83
- | <!-- 例: products --> | <!-- 例: 商品マスタ。販売可能な商品の情報を管理 --> | <!-- 例: id, name, price, stock --> | <!-- 例: 論理削除(is_active)、在庫数は別テーブルでも可 --> |
84
- | <!-- 例: order_items --> | <!-- 例: 注文明細。注文に含まれる商品と数量を管理 --> | <!-- 例: id, order_id, product_id, quantity, unit_price --> | <!-- 例: 価格変更の影響を避けるため unit_price を保持 --> |
85
-
86
- ---
87
-
88
- ## リレーションシップ
89
-
90
- <!--
91
- エンティティ間の関係性を明記
92
-
93
- エンティティ一覧で各テーブルの責務を把握した後、このセクションでテーブル間の関係性を理解します。
94
- その後、ERDで視覚的に確認する流れが自然です。
95
-
96
- テーブル構成:
97
- 【エンティティA / エンティティB】
98
- - リレーションシップの両端のエンティティ名
99
-
100
- 【関係性】
101
- - 多重度を記載
102
- - 1:1(一対一)
103
- - 1:N(一対多)
104
- - N:M(多対多) → 通常は中間テーブルで 1:N + N:1 に分解
105
-
106
- 【外部キー】
107
- - FK として使用されるカラム名
108
- - 命名規則: {参照先テーブル名}_id(例: user_id, product_id)
109
-
110
- 【制約】
111
- - ON DELETE の動作(CASCADE, SET NULL, RESTRICT)
112
- - ON UPDATE の動作
113
- - NOT NULL 制約の有無
114
-
115
- 【備考】
116
- - ビジネスルールの説明
117
- - リレーションシップの意味
118
- - インデックスの有無
119
-
120
- 記載のベストプラクティス:
121
- - 親子関係を明確に
122
- - CASCADE 削除は慎重に(意図しないデータ削除を防ぐ)
123
- - 循環参照に注意
124
- - パフォーマンスを考慮した FK インデックス
125
- -->
126
-
127
- | エンティティA | エンティティB | 関係性 | 外部キー | 制約 | 備考 |
128
- |--------------|--------------|--------|----------|------|------|
129
- | <!-- 例: users --> | <!-- 例: orders --> | <!-- 例: 1:N --> | <!-- 例: user_id --> | <!-- 例: ON DELETE RESTRICT --> | <!-- 例: 1人のユーザーが複数の注文を持つ。ユーザー削除時は注文が残るため RESTRICT --> |
130
- | <!-- 例: orders --> | <!-- 例: order_items --> | <!-- 例: 1:N --> | <!-- 例: order_id --> | <!-- 例: ON DELETE CASCADE --> | <!-- 例: 1つの注文が複数の明細を持つ。注文削除時は明細も削除 --> |
131
- | <!-- 例: products --> | <!-- 例: order_items --> | <!-- 例: 1:N --> | <!-- 例: product_id --> | <!-- 例: ON DELETE RESTRICT --> | <!-- 例: 商品削除時は注文明細が残るため削除不可 --> |
132
-
133
- ---
134
-
135
- ## ERD(Entity Relationship Diagram)
136
-
137
- <!--
138
- Mermaid を使用してデータベース構造を可視化
139
-
140
- エンティティ一覧とリレーションシップで理解した内容を、このERDで視覚的に確認します。
141
-
142
- 記載のベストプラクティス:
143
- 1. すべてのエンティティとリレーションシップを記載
144
- 2. 主キー(PK)、外部キー(FK)を明記
145
- 3. データ型を記載(int, string, datetime, boolean など)
146
- 4. リレーションシップの多重度を正確に表現(1:1, 1:N, N:M)
147
- 5. 複雑な場合は複数の図に分割(コアドメイン、サブドメインごと)
148
-
149
- Mermaid ERD の記法:
150
- - エンティティ名 { 属性名 データ型 制約 }
151
- - リレーションシップ記法:
152
- - ||--|| : 1対1(必須-必須)
153
- - ||--o| : 1対0..1(必須-オプション)
154
- - ||--o{ : 1対多(必須-0以上)
155
- - }o--o{ : 多対多
156
- - PK: Primary Key(主キー)
157
- - FK: Foreign Key(外部キー)
158
- - UK: Unique Key(一意制約)
159
- -->
160
-
161
- ```mermaid
162
- erDiagram
163
- USER ||--o{ ORDER : "places"
164
- USER {
165
- bigint id PK "ユーザーID"
166
- string email UK "メールアドレス(一意)"
167
- string name "氏名"
168
- string password_hash "パスワードハッシュ"
169
- datetime created_at "作成日時"
170
- datetime updated_at "更新日時"
171
- }
172
-
173
- ORDER ||--|{ ORDER_ITEM : "contains"
174
- ORDER {
175
- bigint id PK "注文ID"
176
- bigint user_id FK "ユーザーID"
177
- string status "ステータス: pending, confirmed, shipped, delivered, cancelled"
178
- decimal total_amount "合計金額"
179
- datetime created_at "作成日時"
180
- datetime updated_at "更新日時"
181
- }
182
-
183
- PRODUCT ||--o{ ORDER_ITEM : "is ordered in"
184
- PRODUCT {
185
- bigint id PK "商品ID"
186
- string name "商品名"
187
- text description "商品説明"
188
- decimal price "価格"
189
- int stock "在庫数"
190
- boolean is_active "有効フラグ"
191
- datetime created_at "作成日時"
192
- datetime updated_at "更新日時"
193
- }
194
-
195
- ORDER_ITEM {
196
- bigint id PK "注文明細ID"
197
- bigint order_id FK "注文ID"
198
- bigint product_id FK "商品ID"
199
- int quantity "数量"
200
- decimal unit_price "単価(注文時の価格)"
201
- datetime created_at "作成日時"
202
- }
203
- ```
204
-
205
- **補足**:
206
- <!-- 例:
207
- - USER と ORDER は 1:N の関係(1人のユーザーが複数の注文を持つ)
208
- - ORDER と ORDER_ITEM は 1:N の関係(1つの注文が複数の明細を持つ)
209
- - PRODUCT と ORDER_ITEM は 1:N の関係(1つの商品が複数の注文明細に含まれる)
210
- - unit_price を ORDER_ITEM に持たせることで、価格変更の影響を回避
211
- -->
1
+ # データモデル(ERD)
2
+
3
+ <!--
4
+ 何を書くか: データベース構造、エンティティ、属性、リレーションシップ、制約
5
+
6
+ 目的:
7
+ - データ構造の全体像を可視化
8
+ - テーブル設計の一貫性を保つ
9
+ - 開発者間の認識統一
10
+ - データの整合性ルールを明確化
11
+ - マイグレーション計画の基盤
12
+
13
+ 重要性:
14
+ - データベース設計の記録(ADR: Architecture Decision Record の一部)
15
+ - 正規化・非正規化の判断根拠を記録
16
+ - パフォーマンス最適化の指針
17
+ - データ整合性の担保
18
+ - 将来の拡張性を考慮した設計
19
+
20
+ 記載のポイント:
21
+ - Mermaid ERD で視覚的に表現
22
+ - エンティティごとに責務を明確化
23
+ - リレーションシップと多重度を正確に記載
24
+ - 制約(NOT NULL, UNIQUE, CHECK)を明記
25
+ - インデックス戦略を記録
26
+ - データ型の選択理由を記載
27
+
28
+ 更新頻度:
29
+ - プロジェクト初期にドメインモデルから作成
30
+ - テーブル追加・変更時に更新
31
+ - マイグレーション実行時に更新
32
+ - パフォーマンスチューニング時に見直し
33
+ -->
34
+
35
+ ---
36
+
37
+ ## エンティティ一覧
38
+
39
+ <!--
40
+ 各エンティティの責務と主要属性を明記
41
+
42
+ まずエンティティの一覧を把握してから、ERDで視覚化する流れが自然です。
43
+
44
+ テーブル構成:
45
+ 【エンティティ名】
46
+ - テーブル名(物理名)
47
+ - 複数形推奨(例: users, orders, products)
48
+ - スネークケース推奨(例: order_items, user_roles)
49
+
50
+ 【説明】
51
+ - そのエンティティが表現するビジネス概念
52
+ - 責務と役割
53
+ - ドメインモデルとの対応
54
+
55
+ 【主要属性】
56
+ - 重要なカラムをリスト化
57
+ - すべてを列挙する必要はない(詳細は ERD 参照)
58
+ - ビジネスキーとなる属性を優先的に記載
59
+
60
+ 【備考】
61
+ - 正規化・非正規化の判断理由
62
+ - パーティショニング戦略
63
+ - 削除方法(論理削除 or 物理削除)
64
+ - 監査要件(作成日時、更新日時、削除日時)
65
+
66
+ 記載のベストプラクティス:
67
+ - エンティティの分類を明記(コア、参照、関連、履歴)
68
+ - ソフトデリート(論理削除)の有無を記載
69
+ - タイムスタンプ(created_at, updated_at)の有無
70
+ - ドメインモデルの Aggregate との対応を記載
71
+
72
+ よくあるエンティティの分類:
73
+ - コアエンティティ: ビジネスの中心(User, Order, Product)
74
+ - 参照エンティティ: マスタデータ(Category, Status, Country)
75
+ - 関連エンティティ: 多対多の中間テーブル(UserRole, OrderItem)
76
+ - 履歴エンティティ: 監査ログ、変更履歴(AuditLog, OrderHistory)
77
+ -->
78
+
79
+ | エンティティ名 | 説明 | 主要属性 | 備考 |
80
+ |---------------|------|----------|------|
81
+ | <!-- 例: users --> | <!-- 例: ユーザー情報を管理。システムにアクセスする全てのユーザーを表す --> | <!-- 例: id, email, name, password_hash --> | <!-- 例: 論理削除(deleted_at)、email は一意制約 --> |
82
+ | <!-- 例: orders --> | <!-- 例: 注文情報を管理。ユーザーが商品を購入する取引単位 --> | <!-- 例: id, user_id, status, total_amount --> | <!-- 例: status は enum 型または CHECK 制約、物理削除不可(履歴保持) --> |
83
+ | <!-- 例: products --> | <!-- 例: 商品マスタ。販売可能な商品の情報を管理 --> | <!-- 例: id, name, price, stock --> | <!-- 例: 論理削除(is_active)、在庫数は別テーブルでも可 --> |
84
+ | <!-- 例: order_items --> | <!-- 例: 注文明細。注文に含まれる商品と数量を管理 --> | <!-- 例: id, order_id, product_id, quantity, unit_price --> | <!-- 例: 価格変更の影響を避けるため unit_price を保持 --> |
85
+
86
+ ---
87
+
88
+ ## リレーションシップ
89
+
90
+ <!--
91
+ エンティティ間の関係性を明記
92
+
93
+ エンティティ一覧で各テーブルの責務を把握した後、このセクションでテーブル間の関係性を理解します。
94
+ その後、ERDで視覚的に確認する流れが自然です。
95
+
96
+ テーブル構成:
97
+ 【エンティティA / エンティティB】
98
+ - リレーションシップの両端のエンティティ名
99
+
100
+ 【関係性】
101
+ - 多重度を記載
102
+ - 1:1(一対一)
103
+ - 1:N(一対多)
104
+ - N:M(多対多) → 通常は中間テーブルで 1:N + N:1 に分解
105
+
106
+ 【外部キー】
107
+ - FK として使用されるカラム名
108
+ - 命名規則: {参照先テーブル名}_id(例: user_id, product_id)
109
+
110
+ 【制約】
111
+ - ON DELETE の動作(CASCADE, SET NULL, RESTRICT)
112
+ - ON UPDATE の動作
113
+ - NOT NULL 制約の有無
114
+
115
+ 【備考】
116
+ - ビジネスルールの説明
117
+ - リレーションシップの意味
118
+ - インデックスの有無
119
+
120
+ 記載のベストプラクティス:
121
+ - 親子関係を明確に
122
+ - CASCADE 削除は慎重に(意図しないデータ削除を防ぐ)
123
+ - 循環参照に注意
124
+ - パフォーマンスを考慮した FK インデックス
125
+ -->
126
+
127
+ | エンティティA | エンティティB | 関係性 | 外部キー | 制約 | 備考 |
128
+ |--------------|--------------|--------|----------|------|------|
129
+ | <!-- 例: users --> | <!-- 例: orders --> | <!-- 例: 1:N --> | <!-- 例: user_id --> | <!-- 例: ON DELETE RESTRICT --> | <!-- 例: 1人のユーザーが複数の注文を持つ。ユーザー削除時は注文が残るため RESTRICT --> |
130
+ | <!-- 例: orders --> | <!-- 例: order_items --> | <!-- 例: 1:N --> | <!-- 例: order_id --> | <!-- 例: ON DELETE CASCADE --> | <!-- 例: 1つの注文が複数の明細を持つ。注文削除時は明細も削除 --> |
131
+ | <!-- 例: products --> | <!-- 例: order_items --> | <!-- 例: 1:N --> | <!-- 例: product_id --> | <!-- 例: ON DELETE RESTRICT --> | <!-- 例: 商品削除時は注文明細が残るため削除不可 --> |
132
+
133
+ ---
134
+
135
+ ## ERD(Entity Relationship Diagram)
136
+
137
+ <!--
138
+ Mermaid を使用してデータベース構造を可視化
139
+
140
+ エンティティ一覧とリレーションシップで理解した内容を、このERDで視覚的に確認します。
141
+
142
+ 記載のベストプラクティス:
143
+ 1. すべてのエンティティとリレーションシップを記載
144
+ 2. 主キー(PK)、外部キー(FK)を明記
145
+ 3. データ型を記載(int, string, datetime, boolean など)
146
+ 4. リレーションシップの多重度を正確に表現(1:1, 1:N, N:M)
147
+ 5. 複雑な場合は複数の図に分割(コアドメイン、サブドメインごと)
148
+
149
+ Mermaid ERD の記法:
150
+ - エンティティ名 { 属性名 データ型 制約 }
151
+ - リレーションシップ記法:
152
+ - ||--|| : 1対1(必須-必須)
153
+ - ||--o| : 1対0..1(必須-オプション)
154
+ - ||--o{ : 1対多(必須-0以上)
155
+ - }o--o{ : 多対多
156
+ - PK: Primary Key(主キー)
157
+ - FK: Foreign Key(外部キー)
158
+ - UK: Unique Key(一意制約)
159
+ -->
160
+
161
+ ```mermaid
162
+ erDiagram
163
+ USER ||--o{ ORDER : "places"
164
+ USER {
165
+ bigint id PK "ユーザーID"
166
+ string email UK "メールアドレス(一意)"
167
+ string name "氏名"
168
+ string password_hash "パスワードハッシュ"
169
+ datetime created_at "作成日時"
170
+ datetime updated_at "更新日時"
171
+ }
172
+
173
+ ORDER ||--|{ ORDER_ITEM : "contains"
174
+ ORDER {
175
+ bigint id PK "注文ID"
176
+ bigint user_id FK "ユーザーID"
177
+ string status "ステータス: pending, confirmed, shipped, delivered, cancelled"
178
+ decimal total_amount "合計金額"
179
+ datetime created_at "作成日時"
180
+ datetime updated_at "更新日時"
181
+ }
182
+
183
+ PRODUCT ||--o{ ORDER_ITEM : "is ordered in"
184
+ PRODUCT {
185
+ bigint id PK "商品ID"
186
+ string name "商品名"
187
+ text description "商品説明"
188
+ decimal price "価格"
189
+ int stock "在庫数"
190
+ boolean is_active "有効フラグ"
191
+ datetime created_at "作成日時"
192
+ datetime updated_at "更新日時"
193
+ }
194
+
195
+ ORDER_ITEM {
196
+ bigint id PK "注文明細ID"
197
+ bigint order_id FK "注文ID"
198
+ bigint product_id FK "商品ID"
199
+ int quantity "数量"
200
+ decimal unit_price "単価(注文時の価格)"
201
+ datetime created_at "作成日時"
202
+ }
203
+ ```
204
+
205
+ **補足**:
206
+ <!-- 例:
207
+ - USER と ORDER は 1:N の関係(1人のユーザーが複数の注文を持つ)
208
+ - ORDER と ORDER_ITEM は 1:N の関係(1つの注文が複数の明細を持つ)
209
+ - PRODUCT と ORDER_ITEM は 1:N の関係(1つの商品が複数の注文明細に含まれる)
210
+ - unit_price を ORDER_ITEM に持たせることで、価格変更の影響を回避
211
+ -->