Roop · DB 設計
Firestore のコレクション構造と書き込みパターン
全体構造
// Firestore ルート構造
/users/{uid} // ユーザードキュメント
└── runs/{runId} // サブコレクション (1 走行 = 1 ドキュメント)
ユーザーごとに完全に分離。{uid} は Firebase Auth が発行する一意 ID。
users ドキュメント
1 ユーザー = 1 ドキュメント。設定値をフラットなフィールドで持つ。
/users/{uid}
| フィールド | 型 | 説明 |
|---|---|---|
| defaultDistanceKm | number | 前回入力した距離 (デフォルト 3.0) |
| lastMode | string | "jogging" / "walking" |
| mood | number | 0.0 (静か) 〜 1.0 (賑やか) — UI 非表示 |
| food | number | 0.0 (食事少) 〜 1.0 (食事多) |
| nature | number | 0.0 (街中) 〜 1.0 (自然) |
| terrain | number | 0.0 (平坦) 〜 1.0 (起伏) |
runs サブコレクション
1 走行を 1 ドキュメントで表現。走行開始時に作成し、走行中に actualTrack へ座標を追記、終了時に status を確定。
/users/{uid}/runs/{runId}
| フィールド | 型 | 説明 |
|---|---|---|
| id | string | Firestore ドキュメント ID と同じ値を冗長で保存 |
| startedAt | timestamp | 走行開始日時 |
| completedAt | timestamp? | 走行終了日時 (完了 or 中断時にセット) |
| status | string | "in_progress" / "completed" / "aborted" |
| mode | string | "jogging" / "walking" |
| sliderValues | map | mood / food / nature / terrain (0.0〜1.0) |
| plannedRoute | map | AI が選んだ計画ルート (下記参照) |
| actualTrack | array | 実走した座標点列 (5 秒ごとに追記) |
| caloriesKcal | number? | 消費カロリー (終了時に確定) |
| lapRecords | array | 1km ラップ記録 |
plannedRoute (ネスト)
| distanceMeters | number | 道なり距離 (Routes API の戻り値) |
| durationSeconds | number | 予想時間 |
| encodedPolyline | string | 圧縮ポリライン (Google polyline format) |
| waypoints | array | 経由地リスト ({lat, lng, name, placeId, type}) |