🗄️ データモデル
「バスケしようよ!」のデータベース設計です。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
ユーザー(参加者・主催者)- プロフィール作成・編集画面の全フィールドに対応
| カラム名 | 型 | 制約 | 説明 |
|---|---|---|---|
| id | UUID | PK | ユーザーID |
| VARCHAR | UNIQUE, NOT NULL | メールアドレス | |
| nickname | VARCHAR(20) | NOT NULL | ニックネーム(2〜20文字) |
| username | VARCHAR(30) | UNIQUE | ユーザーID(@表示用) |
| avatar_url | TEXT | - | プロフィール画像URL |
| gender | ENUM | - | 性別(男性/女性/その他/未設定) |
| date_of_birth | DATE | - | 生年月日 |
| position | ENUM | - | ポジション(PG/SG/SF/PF/C/オールラウンド)※複数選択可 |
| height | INTEGER | - | 身長(cm) |
| basketball_experience | ENUM | - | バスケ歴(未経験/1年未満/1-3年/3-5年/5-10年/10年以上) |
| area | VARCHAR | - | 活動エリア(都道府県) |
| city | VARCHAR | - | 活動エリア(市区町村) |
| bio | TEXT | - | 自己紹介(500文字以内) |
| twitter_handle | VARCHAR | - | Twitter/X アカウント |
| instagram_handle | VARCHAR | - | Instagram アカウント |
| status | ENUM | DEFAULT 'active' | アカウント状態(仮登録/アクティブ/停止/退会済み/削除済み) |
| created_at | TIMESTAMP | DEFAULT NOW() | 作成日時 |
| updated_at | TIMESTAMP | - | 更新日時 |
Event
募集(ピックアップゲーム)- 募集作成3ステップ・編集画面の全フィールドに対応
| カラム名 | 型 | 制約 | 説明 |
|---|---|---|---|
| id | UUID | PK | 募集ID |
| organizer_id | UUID | FK → User | 主催者ID |
| title | VARCHAR(100) | NOT NULL | 募集名 |
| description | TEXT | - | 詳細説明 |
| image_url | TEXT | - | 募集画像URL(ステップ3でアップロード) |
| date | DATE | NOT NULL | 開催日 |
| start_time | TIME | NOT NULL | 開始時間 |
| end_time | TIME | NOT NULL | 終了時間 |
| location | VARCHAR | NOT NULL | 施設名 |
| address | VARCHAR | - | 住所 |
| capacity | INTEGER | 1〜100 | 募集人数 |
| level | ENUM | - | 募集レベル(初心者歓迎/経験者向け/レベル問わず) |
| fee | INTEGER | >= 0 | 参加費(円) |
| status | ENUM | DEFAULT '募集中' | ステータス(下書き/募集中/満員/締切/開催中/終了/キャンセル) |
| created_at | TIMESTAMP | DEFAULT NOW() | 作成日時 |
| updated_at | TIMESTAMP | - | 更新日時 |
Participation
参加申請 - 参加申請確認画面のフィールドに対応
| カラム名 | 型 | 制約 | 説明 |
|---|---|---|---|
| id | UUID | PK | 参加申請ID |
| event_id | UUID | FK → Event | 募集ID |
| user_id | UUID | FK → User | ユーザーID |
| status | ENUM | DEFAULT '申請中' | ステータス(申請中/承認/拒否/キャンセル) |
| cancelled_by | ENUM | NULLABLE | キャンセル種別(user/organizer/event)※status=キャンセル時のみ |
| message | TEXT | - | 主催者へのメッセージ(申請時に任意入力) |
| created_at | TIMESTAMP | DEFAULT NOW() | 申請日時 |
| updated_at | TIMESTAMP | - | 更新日時 |
Message
メッセージ - チャット画面(一覧・会話)に対応
| カラム名 | 型 | 制約 | 説明 |
|---|---|---|---|
| id | UUID | PK | メッセージID |
| event_id | UUID | FK → Event, NULLABLE | 募集ID(グループチャット用) |
| sender_id | UUID | FK → User | 送信者ID |
| recipient_id | UUID | FK → User, NULLABLE | 受信者ID(DM用) |
| content | TEXT | 1〜1000文字 | メッセージ本文 |
| is_read | BOOLEAN | DEFAULT FALSE | 既読フラグ |
| created_at | TIMESTAMP | DEFAULT NOW() | 送信日時 |
| updated_at | TIMESTAMP | - | 更新日時 |
Notification
通知 - 通知一覧画面に対応(6種別の通知を管理)
| カラム名 | 型 | 制約 | 説明 |
|---|---|---|---|
| id | UUID | PK | 通知ID |
| user_id | UUID | FK → User | 通知先ユーザーID |
| type | ENUM | NOT NULL | 通知種別(参加承認/参加申請/メッセージ/リマインダー/キャンセル/システム) |
| title | VARCHAR | NOT NULL | 通知タイトル |
| message | TEXT | - | 通知本文 |
| read | BOOLEAN | DEFAULT FALSE | 既読フラグ |
| related_event_id | UUID | FK → Event, NULLABLE | 関連募集ID(遷移先決定用) |
| related_user_id | UUID | FK → User, NULLABLE | 関連ユーザーID |
| created_at | TIMESTAMP | DEFAULT NOW() | 作成日時 |
Report
通報 - 管理者通報管理画面に対応
| カラム名 | 型 | 制約 | 説明 |
|---|---|---|---|
| id | UUID | PK | 通報ID |
| reporter_id | UUID | FK → User | 通報者ID |
| target_type | ENUM | NOT NULL | 対象種別(ユーザー/募集/メッセージ) |
| target_id | UUID | NOT NULL | 対象ID |
| reason | TEXT | NOT NULL | 通報理由 |
| status | ENUM | DEFAULT '未対応' | 対応状況(未対応/対応中/解決済み/却下) |
| priority | ENUM | DEFAULT '中' | 優先度(高/中/低) |
| created_at | TIMESTAMP | DEFAULT NOW() | 作成日時 |
| updated_at | TIMESTAMP | - | 更新日時 |
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);
-- 管理者の通報一覧取得高速化