コンテンツにスキップ

DBスキーマ設計

全テーブル共通:

  • タイムスタンプは timestamptz(UTC保存)
  • 主キーは serial(auto increment)

users

カラム備考
idserial主キー
emailvarchar一意制約
created_attimestamptz作成日時
updated_attimestamptz更新日時

auth_codes

カラム備考
idserial主キー
emailvarchar送信先メールアドレス
codevarchar6桁認証コード(プレーンテキスト保存)
attemptsinteger試行回数(初期値0、上限3)
expires_attimestamptz有効期限
created_attimestamptz作成日時
  • 新しいコード発行時、同一メールアドレスの既存未使用コードは無効化する
  • 期限切れレコードは1日1回のバッチ処理で削除

sessions

カラム備考
idserial主キー
user_idintegerFK → users.id
tokenvarcharセッショントークン(nanoid生成)
refresh_tokenvarcharリフレッシュトークン(nanoid生成)
expires_attimestamptzセッション有効期限(7日)
refresh_token_expires_attimestamptzリフレッシュトークン有効期限(30日)
ip_addressvarchar接続元IP
user_agentvarcharデバイス識別用
created_attimestamptz作成日時
  • リフレッシュ時に旧トークンを即無効化(ローテーション)
  • 期限切れレコードは1日1回のバッチ処理で削除

cat_breeds

カラム備考
idserial主キー
namevarchar品種名(一意制約)
created_attimestamptz作成日時
updated_attimestamptz更新日時
  • FR-013(マスタデータ管理)で管理画面からの追加・編集を提供予定

pets

カラム備考
idserial主キー
user_idintegerFK → users.id
namevarcharペット名(必須、1〜50文字)
breed_idintegerFK → cat_breeds.id(nullable)
breed_othervarchar品種自由入力(nullable、breed_id未指定時のみ)
date_of_birthdate生年月日(nullable)
is_birthday_estimatedboolean推定フラグ(default false)
sexvarcharmale / female / unknown
is_neuteredboolean避妊/去勢済み
coat_colorvarchar毛色(nullable、1〜50文字)
photo_urlvarchar写真URL(nullable、アップロード機能は後続フェーズ)
memotextメモ(nullable、最大500文字)
deleted_attimestamptz論理削除日時(nullable)
created_attimestamptz作成日時
updated_attimestamptz更新日時
  • 論理削除: deleted_at IS NULL でアクティブなペットをフィルタ
  • 健康記録(体重・食事・通院等)の親エンティティ
  • ペット論理削除時、関連する健康記録は保持する(ペット復元時にデータが残る)

weight_records

カラム備考
idserial主キー
pet_idintegerFK → pets.id(CASCADE DELETE)
weight_ginteger体重(グラム単位、1〜30000)
recorded_attimestamptz計測日時(クライアント指定)
memotextメモ(nullable、最大200文字)
created_attimestamptz作成日時
updated_attimestamptz更新日時
  • 同一ペット・同一日時での複数レコードを許可する(一意制約なし)
  • ペット削除時にカスケード削除される
  • recorded_at + pet_id にインデックスを作成(日付範囲検索の高速化)

meal_records

カラム備考
idserial主キー
pet_idintegerFK → pets.id(CASCADE DELETE)
food_namevarcharフード名(必須、1〜100文字)
food_typevarchardry / wet / treat / supplement / other
amountnumeric量(正の数値)
amount_unitvarcharg / ml / piece
meal_datedate食事日(必須、未来日不可)
meal_timetime食事時刻(nullable)
memotextメモ(nullable、最大500文字)
created_attimestamptz作成日時
updated_attimestamptz更新日時
  • ペット削除時にカスケード削除(物理削除)
  • インデックス: (pet_id, meal_date) で日付検索を高速化

vet_visits

カラム備考
idserial主キー
pet_idintegerFK → pets.id
visited_ondate受診日(必須)
clinic_namevarchar病院名(必須、1〜100文字)
diagnosistext診察内容(nullable、最大2000文字)
costinteger費用(nullable、円単位、0以上)
next_visit_datedate次回予定日(nullable、FR-010リマインド起点)
memotextメモ(nullable、最大500文字)
deleted_attimestamptz論理削除日時(nullable)
created_attimestamptz作成日時
updated_attimestamptz更新日時
  • 論理削除: deleted_at IS NULL でアクティブな記録をフィルタ
  • 病院名は自由入力テキスト(将来マスタ化を検討)
  • 費用は日本円(税込総額)を整数で保存
  • next_visit_date は FR-010(通知・リマインド)の通院リマインド起点

vaccine_types

カラム備考
idserial主キー
namevarcharワクチン種類名(一意制約)
created_attimestamptz作成日時
updated_attimestamptz更新日時
  • FR-013(マスタデータ管理)で管理画面からの追加・編集を提供予定
  • cat_breeds と同様のマスタテーブルパターン

vaccine_records

カラム備考
idserial主キー
pet_idintegerFK → pets.id(必須)
vaccine_type_idintegerFK → vaccine_types.id(nullable)
vaccine_type_othervarcharワクチン種類自由入力(nullable、vaccine_type_id未指定時のみ)
vaccinated_ondate接種日(必須、未来日不可)
next_due_datedate次回予定日(nullable、vaccinated_onより後)
visit_idintegerFK → vet_visits.id(nullable、通院記録との紐付け)
memotextメモ(nullable、最大500文字)
deleted_attimestamptz論理削除日時(nullable)
created_attimestamptz作成日時
updated_attimestamptz更新日時
  • 論理削除: deleted_at IS NULL でアクティブな記録をフィルタ
  • vaccine_type_idvaccine_type_other のいずれか一方が必須
  • visit_id は FR-006(通院履歴管理)実装後に有効化

symptom_categories

カラム備考
idserial主キー
namevarchar症状カテゴリ名(一意制約)
created_attimestamptz作成日時
updated_attimestamptz更新日時
  • FR-013(マスタデータ管理)で管理画面からの追加・編集を提供予定
  • 初期データ: 嘔吐, 下痢, 便秘, 食欲不振, くしゃみ, 咳, 鼻水, 目やに, 皮膚の異常, 脱毛, 元気がない, 体重減少, 過剰な毛づくろい, 排尿の異常

health_logs

カラム備考
idserial主キー
pet_idintegerFK → pets.id
symptom_category_idintegerFK → symptom_categories.id(nullable)
symptom_othervarchar症状自由入力(nullable、symptom_category_id未指定時のみ)
severityvarcharmild / moderate / severe
memotextメモ(nullable、最大1000文字)
observed_attimestamptz症状観察日時
created_attimestamptz作成日時
updated_attimestamptz更新日時
  • 体調メモと症状報告を統一管理する単一テーブル
  • symptom_category_idsymptom_other のいずれも未指定の場合はカテゴリなしの体調メモとして扱う
  • 物理削除(末端データのため論理削除は不要)

medications

カラム備考
idserial主キー
pet_idintegerFK → pets.id
namevarchar薬名(必須、1〜100文字)
dosage_amountdecimal用量(必須、0より大きい値)
dosage_unitvarchar単位(必須、enum: tablet/capsule/ml/mg/g/drop/packet/piece/tube/cm/puff)
times_per_dayinteger1日の投与回数(必須、1〜24)
frequency_notevarchar頻度の補足(nullable、最大100文字。例: 「朝夕食後」)
routevarchar投与経路(enum: oral/topical/eye/ear/injection/inhalation/other、default: oral)
start_datedate投薬開始日(必須)
end_datedate投薬終了日(nullable、nullの場合は継続中)
memotextメモ(nullable、最大500文字)
deleted_attimestamptz論理削除日時(nullable)
created_attimestamptz作成日時
updated_attimestamptz更新日時
  • 投薬状態は end_datedeleted_at から導出(is_active カラムは持たない)
  • 投薬中: end_date IS NULL OR end_date >= CURRENT_DATE かつ deleted_at IS NULL
  • 終了済み: end_date < CURRENT_DATE かつ deleted_at IS NULL
  • 論理削除: deleted_at IS NOT NULL

medication_logs

カラム備考
idserial主キー
medication_idintegerFK → medications.id
statusvarchar投与ステータス(enum: administered/skipped/partial)
administered_attimestamptz投与日時(必須、未来日時不可)
dosage_amountdecimal実際の用量(nullable、省略時は medications の値を参照)
dosage_unitvarchar実際の単位(nullable、省略時は medications の値を参照)
memotextメモ(nullable、最大500文字)
created_attimestamptz作成日時
  • medications との関連: 投薬スケジュール1件に対して複数の投薬記録
  • dosage_amount / dosage_unit は両方指定するか両方省略のみ許可
  • 投薬スケジュール論理削除時も記録は保持される

device_tokens

カラム備考
idserial主キー
user_idintegerFK → users.id
tokenvarcharFCMデバイストークン(一意制約)
platformvarcharios / android / web
created_attimestamptz作成日時
updated_attimestamptz更新日時
  • 同一トークンの重複登録を防ぐため token に UNIQUE 制約
  • ログアウト時に該当デバイスのトークンを削除
  • FCMから無効トークンエラーが返った場合は自動削除

notification_settings

カラム備考
idserial主キー
user_idintegerFK → users.id
pet_idintegerFK → pets.id
typevarcharvaccine / medication / visit
enabledboolean通知の有効/無効(default true)
push_enabledbooleanプッシュ通知の有効/無効(default true)
email_enabledbooleanメール通知の有効/無効(default false)
remind_days_beforeinteger[]リマインド日数の配列(例: {7,1})
send_timetime送信時刻(default ‘09:00’)
timezonevarcharタイムゾーン(default ‘Asia/Tokyo’)
medication_notify_modevarcharevery_dose / start_end_only(type=‘medication’ 時のみ使用、default ‘every_dose’)
created_attimestamptz作成日時
updated_attimestamptz更新日時
  • (user_id, pet_id, type) に UNIQUE 制約
  • ペット登録時に全通知タイプのデフォルト設定を自動作成
  • デフォルトの remind_days_before: vaccine={7,1}、medication={0}、visit={3,1}

notifications

カラム備考
idserial主キー
user_idintegerFK → users.id
pet_idintegerFK → pets.id
typevarcharvaccine / medication / visit
titlevarchar通知タイトル
bodytext通知本文
trigger_datedateリマインド対象の予定日
remind_days_beforeintegerこの通知の何日前設定に対応するか
read_attimestamptz既読日時(nullable、未読はNULL)
created_attimestamptz作成日時
  • (user_id, pet_id, type, trigger_date, remind_days_before) に UNIQUE 制約(重複通知防止)
  • ペット論理削除後は新規通知を生成しない
  • 既読管理はアプリ内通知用(プッシュ・メールは送信のみ)