Skip to content

データベース設計

ER図(概念)

┌──────────┐     ┌──────────────┐     ┌──────────────┐
│  users   │────<│  user_miles  │     │   airports   │
└────┬─────┘     └──────────────┘     └──────┬───────┘
     │                                       │
     │           ┌──────────────┐            │
     ├──────────<│    trips     │     ┌──────┴───────┐
     │           └──────┬───────┘     │ mile_charts  │
     │                  │             └──────────────┘
     │    ┌─────────────┼─────────────┐
     │    │             │             │
     │ ┌──▼────┐  ┌─────▼─────┐  ┌────▼───────┐
     │ │ trip_ │  │ trip_     │  │ trip_      │
     │ │flights│  │accomm.    │  │itinerary   │
     │ └───────┘  └───────────┘  └────────────┘

     │          ┌────────────────────┐
     │          │ flight_availability│  ← Phase 2
     │          └────────────────────┘

     │          ┌──────────┐
     │          │  hotels  │  ← Phase 2
     │          └──────────┘

     │          ┌─────────────┐     ┌──────────────────┐
     ├─────────<│ gourmet_    │>────│   restaurants    │  ← Phase 2
     │          │ bookmarks   │     └──────────────────┘
     │          └─────────────┘

     │          ┌──────────┐
     │          │campaigns │  ← Phase 2
                └──────────┘

テーブル定義

users(ユーザー)

カラム制約説明
idINTEGERPK, AUTOユーザーID
emailTEXTUNIQUE, NOT NULLメールアドレス
nameTEXTNOT NULL表示名
password_hashTEXTNOT NULLパスワードハッシュ
default_airportTEXTデフォルト出発空港コード
created_atDATETIMEDEFAULT NOW作成日時
updated_atDATETIMEDEFAULT NOW更新日時

user_miles(マイル残高)

カラム制約説明
idINTEGERPK, AUTOID
user_idINTEGERFK → usersユーザーID
airlineTEXTNOT NULL'ANA' or 'JAL'
balanceINTEGERNOT NULL所持マイル数
expiry_dateDATE有効期限
updated_atDATETIMEDEFAULT NOW更新日時

UNIQUE制約: (user_id, airline)

airports(空港マスタ)

カラム制約説明
codeTEXTPKIATA空港コード (e.g., HND)
nameTEXTNOT NULL空港名
cityTEXTNOT NULL都市名
prefectureTEXTNOT NULL都道府県
regionTEXTNOT NULL地方(北海道、東北、...)
latitudeREALNOT NULL緯度
longitudeREALNOT NULL経度

mile_charts(必要マイルチャート)

カラム制約説明
idINTEGERPK, AUTOID
airlineTEXTNOT NULL'ANA' or 'JAL'
origin_codeTEXTFK → airports出発空港コード
destination_codeTEXTFK → airports到着空港コード
seat_classTEXTNOT NULL座席クラス
seasonTEXTNOT NULLシーズン区分
miles_requiredINTEGERNOT NULL必要マイル数
is_round_tripBOOLEANDEFAULT false往復フラグ
updated_atDATETIMEDEFAULT NOW更新日時

インデックス: (airline, origin_code, season)

seasons(シーズン定義)

カラム制約説明
idINTEGERPK, AUTOID
airlineTEXTNOT NULL'ANA' or 'JAL'
season_typeTEXTNOT NULLL/R/H (ANA) or 通常/ディスカウント (JAL)
start_dateDATENOT NULL開始日
end_dateDATENOT NULL終了日
yearINTEGERNOT NULL適用年度

trips(旅行プラン)

カラム制約説明
idINTEGERPK, AUTOID
user_idINTEGERFK → usersユーザーID
titleTEXTNOT NULLプラン名
destinationTEXT目的地
start_dateDATE出発日
end_dateDATE帰着日
statusTEXTDEFAULT 'draft'draft / planned / completed
notesTEXTメモ
created_atDATETIMEDEFAULT NOW作成日時
updated_atDATETIMEDEFAULT NOW更新日時

trip_flights(フライト情報)

カラム制約説明
idINTEGERPK, AUTOID
trip_idINTEGERFK → trips旅行プランID
airlineTEXTNOT NULL航空会社
flight_numberTEXT便名
origin_codeTEXTNOT NULL出発空港
destination_codeTEXTNOT NULL到着空港
departure_atDATETIME出発日時
arrival_atDATETIME到着日時
miles_usedINTEGER使用マイル数
seat_classTEXT座席クラス
booking_statusTEXTDEFAULT 'planned'planned / booked / cancelled

trip_accommodations(宿泊情報)

カラム制約説明
idINTEGERPK, AUTOID
trip_idINTEGERFK → trips旅行プランID
providerTEXTNOT NULL予約サイト名
hotel_nameTEXTNOT NULLホテル名
check_inDATENOT NULLチェックイン日
check_outDATENOT NULLチェックアウト日
price_per_nightINTEGER1泊料金(円)
total_priceINTEGER合計料金(円)
booking_urlTEXT予約URL
booking_statusTEXTDEFAULT 'planned'planned / booked / cancelled

trip_itinerary(日程アイテム)

カラム制約説明
idINTEGERPK, AUTOID
trip_idINTEGERFK → trips旅行プランID
day_numberINTEGERNOT NULL何日目
sort_orderINTEGERNOT NULL表示順
typeTEXTNOT NULLtransport / activity / meal / other
titleTEXTNOT NULLタイトル
descriptionTEXT説明
start_timeTEXT開始時刻
end_timeTEXT終了時刻
locationTEXT場所
costINTEGERDEFAULT 0費用(円)

accommodation_cache(宿泊料金キャッシュ)

カラム制約説明
idINTEGERPK, AUTOID
providerTEXTNOT NULL予約サイト名
destinationTEXTNOT NULL目的地
check_inDATENOT NULLチェックイン日
check_outDATENOT NULLチェックアウト日
guestsINTEGERNOT NULL宿泊人数
response_jsonTEXTNOT NULLAPIレスポンス(JSON)
fetched_atDATETIMEDEFAULT NOW取得日時
expires_atDATETIMENOT NULL有効期限

インデックス: (provider, destination, check_in, check_out)

Phase 2 追加テーブル

Phase 2 で追加された新規テーブル群です。マイグレーション 002_flight_availability.sql005_campaigns.sql で定義されています。

flight_availability(フライト空席情報)

検索結果の空席カレンダー表示・お得フラグの判定に使用します。

カラム制約説明
idINTEGERPK, AUTOID
origin_codeTEXTFK → airports出発空港コード
destination_codeTEXTFK → airports到着空港コード
flight_dateDATENOT NULLフライト日
airlineTEXTNOT NULL'ANA' or 'JAL'
seats_availableINTEGERNOT NULL残席数
miles_requiredINTEGERNOT NULL必要マイル数
is_dealBOOLEANDEFAULT falseお得便フラグ

インデックス: (origin_code, destination_code, flight_date), (airline, flight_date)

hotels(ホテルマスタ)

目的地ごとのホテル候補を保持します。Phase 2 ではモックデータとして運用し、Phase 3 で実プロバイダー API に置換予定です。

カラム制約説明
idINTEGERPK, AUTOID
destination_codeTEXTFK → airports目的地空港コード
nameTEXTNOT NULLホテル名
descriptionTEXT説明文
image_urlTEXT画像URL
price_per_nightINTEGERNOT NULL1泊料金(円)
ratingREALレーティング (0-5)
review_countINTEGERDEFAULT 0レビュー件数
providerTEXT予約サイト名
booking_urlTEXT予約URL
amenitiesTEXTアメニティ(JSON配列)

インデックス: (destination_code, price_per_night)

restaurants(レストランマスタ)

グルメメインタブで使用する、地域ごとのレストラン情報。食べログ・Google 両方のレーティングソースを持ちます。

カラム制約説明
idINTEGERPK, AUTOID
regionTEXTNOT NULL地方(北海道、関西 など)
areaTEXTNOT NULLエリア詳細(札幌駅前 など)
nameTEXTNOT NULL店舗名
cuisineTEXTNOT NULLジャンル(寿司、ラーメン など)
price_rangeTEXT価格帯(¥¥ など)
image_urlTEXT画像URL
tabelog_ratingREAL食べログ評価 (0-5)
tabelog_reviewsINTEGER食べログ口コミ数
tabelog_urlTEXT食べログURL
google_ratingREALGoogle 評価 (0-5)
google_reviewsINTEGERGoogle 口コミ数
google_urlTEXTGoogle マップURL
hoursTEXT営業時間
phoneTEXT電話番号
descriptionTEXT説明文

インデックス: (region, cuisine)

gourmet_bookmarks(グルメブックマーク)

ユーザーが保存したレストラン。旅行計画提案 UX の入力になります。

カラム制約説明
idINTEGERPK, AUTOID
user_idINTEGERFK → usersユーザーID
restaurant_idINTEGERFK → restaurantsレストランID
created_atDATETIMEDEFAULT NOW作成日時

UNIQUE制約: (user_id, restaurant_id)

campaigns(航空会社キャンペーン)

ダッシュボードで表示する ANA/JAL のキャンペーン情報です。

カラム制約説明
idINTEGERPK, AUTOID
airlineTEXTNOT NULL'ANA' or 'JAL'
titleTEXTNOT NULLキャンペーン名
descriptionTEXT詳細説明
image_urlTEXT画像URL
start_dateDATENOT NULL開始日
end_dateDATENOT NULL終了日
link_urlTEXT詳細ページURL
is_activeBOOLEANDEFAULT true有効フラグ
priorityINTEGERDEFAULT 0表示優先度

インデックス: (airline, is_active, priority)

マイグレーション戦略

SQLite のマイグレーションは server/migrations/ ディレクトリにSQLファイルとして管理:

server/migrations/
├── 001_initial_schema.sql
├── 002_flight_availability.sql
├── 003_hotels.sql
├── 004_restaurants_and_bookmarks.sql
└── 005_campaigns.sql

アプリ起動時に未適用のマイグレーションを順番に実行する。