🗄️ データモデル

「バスケしようよ!」のデータベース設計です。Supabase(PostgreSQL)を使用します。 デザインプレビューの全28画面に対応した6エンティティ構成。

ER図(Entity-Relationship Diagram)

リレーション

User 1 : N Eventユーザーは複数の募集を主催できる
User 1 : N Participationユーザーは複数の募集に参加申請できる
Event 1 : N Participation募集には複数の参加申請がある
User 1 : N Messageユーザーは複数のメッセージを送信できる
Event 1 : N Message募集には複数のメッセージがある(グループチャット)
User 1 : N Notificationユーザーは複数の通知を受け取る
Event 1 : N Notification募集は複数の通知をトリガーする
User 1 : N Reportユーザーは複数の通報を送信できる

エンティティ詳細

User

ユーザー(参加者・主催者)- プロフィール作成・編集画面の全フィールドに対応

カラム名制約説明
idUUIDPKユーザーID
emailVARCHARUNIQUE, NOT NULLメールアドレス
nicknameVARCHAR(20)NOT NULLニックネーム(2〜20文字)
usernameVARCHAR(30)UNIQUEユーザーID(@表示用)
avatar_urlTEXT-プロフィール画像URL
genderENUM-性別(男性/女性/その他/未設定)
date_of_birthDATE-生年月日
positionENUM-ポジション(PG/SG/SF/PF/C/オールラウンド)※複数選択可
heightINTEGER-身長(cm)
basketball_experienceENUM-バスケ歴(未経験/1年未満/1-3年/3-5年/5-10年/10年以上)
areaVARCHAR-活動エリア(都道府県)
cityVARCHAR-活動エリア(市区町村)
bioTEXT-自己紹介(500文字以内)
twitter_handleVARCHAR-Twitter/X アカウント
instagram_handleVARCHAR-Instagram アカウント
statusENUMDEFAULT 'active'アカウント状態(仮登録/アクティブ/停止/退会済み/削除済み)
created_atTIMESTAMPDEFAULT NOW()作成日時
updated_atTIMESTAMP-更新日時

Event

募集(ピックアップゲーム)- 募集作成3ステップ・編集画面の全フィールドに対応

カラム名制約説明
idUUIDPK募集ID
organizer_idUUIDFK → User主催者ID
titleVARCHAR(100)NOT NULL募集名
descriptionTEXT-詳細説明
image_urlTEXT-募集画像URL(ステップ3でアップロード)
dateDATENOT NULL開催日
start_timeTIMENOT NULL開始時間
end_timeTIMENOT NULL終了時間
locationVARCHARNOT NULL施設名
addressVARCHAR-住所
capacityINTEGER1〜100募集人数
levelENUM-募集レベル(初心者歓迎/経験者向け/レベル問わず)
feeINTEGER>= 0参加費(円)
statusENUMDEFAULT '募集中'ステータス(下書き/募集中/満員/締切/開催中/終了/キャンセル)
created_atTIMESTAMPDEFAULT NOW()作成日時
updated_atTIMESTAMP-更新日時

Participation

参加申請 - 参加申請確認画面のフィールドに対応

カラム名制約説明
idUUIDPK参加申請ID
event_idUUIDFK → Event募集ID
user_idUUIDFK → UserユーザーID
statusENUMDEFAULT '申請中'ステータス(申請中/承認/拒否/キャンセル)
cancelled_byENUMNULLABLEキャンセル種別(user/organizer/event)※status=キャンセル時のみ
messageTEXT-主催者へのメッセージ(申請時に任意入力)
created_atTIMESTAMPDEFAULT NOW()申請日時
updated_atTIMESTAMP-更新日時

Message

メッセージ - チャット画面(一覧・会話)に対応

カラム名制約説明
idUUIDPKメッセージID
event_idUUIDFK → Event, NULLABLE募集ID(グループチャット用)
sender_idUUIDFK → User送信者ID
recipient_idUUIDFK → User, NULLABLE受信者ID(DM用)
contentTEXT1〜1000文字メッセージ本文
is_readBOOLEANDEFAULT FALSE既読フラグ
created_atTIMESTAMPDEFAULT NOW()送信日時
updated_atTIMESTAMP-更新日時

Notification

通知 - 通知一覧画面に対応(6種別の通知を管理)

カラム名制約説明
idUUIDPK通知ID
user_idUUIDFK → User通知先ユーザーID
typeENUMNOT NULL通知種別(参加承認/参加申請/メッセージ/リマインダー/キャンセル/システム)
titleVARCHARNOT NULL通知タイトル
messageTEXT-通知本文
readBOOLEANDEFAULT FALSE既読フラグ
related_event_idUUIDFK → Event, NULLABLE関連募集ID(遷移先決定用)
related_user_idUUIDFK → User, NULLABLE関連ユーザーID
created_atTIMESTAMPDEFAULT NOW()作成日時

Report

通報 - 管理者通報管理画面に対応

カラム名制約説明
idUUIDPK通報ID
reporter_idUUIDFK → User通報者ID
target_typeENUMNOT NULL対象種別(ユーザー/募集/メッセージ)
target_idUUIDNOT NULL対象ID
reasonTEXTNOT NULL通報理由
statusENUMDEFAULT '未対応'対応状況(未対応/対応中/解決済み/却下)
priorityENUMDEFAULT '中'優先度(高/中/低)
created_atTIMESTAMPDEFAULT NOW()作成日時
updated_atTIMESTAMP-更新日時

ENUM定義

user_gender

男性女性その他未設定

user_position

PGSGSFPFCオールラウンド

basketball_experience

未経験1年未満1-3年3-5年5-10年10年以上

user_status

仮登録アクティブ停止退会済み削除済み

event_level

初心者歓迎経験者向けレベル問わず

event_status

下書き募集中満員締切開催中終了キャンセル

participation_status

申請中承認拒否キャンセル

cancelled_by

userorganizerevent

notification_type

参加承認参加申請メッセージリマインダーキャンセルシステム

report_target_type

ユーザーイベントメッセージ

report_status

未対応対応中解決済み却下

report_priority

推奨インデックス

CREATE INDEX idx_events_date ON events(date);

-- 日付での検索高速化

CREATE INDEX idx_events_area ON events(address);

-- エリアでの検索高速化

CREATE INDEX idx_events_status ON events(status);

-- ステータスでのフィルタリング高速化

CREATE INDEX idx_participations_event ON participations(event_id);

-- 募集の参加者取得高速化

CREATE INDEX idx_participations_user ON participations(user_id);

-- ユーザーの参加募集取得高速化

CREATE INDEX idx_messages_event ON messages(event_id, created_at);

-- メッセージスレッド取得高速化

CREATE INDEX idx_messages_recipient ON messages(recipient_id, is_read);

-- DM未読メッセージ取得高速化

CREATE INDEX idx_notifications_user ON notifications(user_id, read, created_at);

-- ユーザーの未読通知取得高速化

CREATE INDEX idx_reports_status ON reports(status, priority);

-- 管理者の通報一覧取得高速化