# データベース設計書

## 概要

本ドキュメントは、Fizzyプロジェクト（タスク管理・コラボレーションツール）のデータベース設計を記載したものです。本システムはRuby on Rails 8.2フレームワークを使用し、MySQL 8.0（utf8mb4エンコーディング）をデータベースとして採用しています。全テーブルでUUIDを主キーとして使用し、マルチテナント対応のためほぼ全てのテーブルにaccount_idカラムを持たせています。

## テーブル一覧

| テーブル名 | 対応エンティティ | 説明 |
| --- | --- | --- |
| accounts | Account | アカウント（テナント）情報を管理 |
| account_cancellations | AccountCancellation | アカウントのキャンセル情報 |
| account_external_id_sequences | Account::ExternalIdSequence | 外部アカウントIDのシーケンス管理 |
| account_imports | Account::Import | アカウントインポート状態管理 |
| account_join_codes | Account::JoinCode | アカウント参加コード |
| identities | Identity | 認証アイデンティティ（メールアドレス） |
| identity_access_tokens | Identity::AccessToken | APIアクセストークン |
| users | User | アカウント内のユーザー |
| user_settings | UserSetting | ユーザー設定 |
| sessions | Session | ログインセッション |
| magic_links | MagicLink | マジックリンク認証 |
| boards | Board | ボード（プロジェクト単位） |
| board_publications | BoardPublication | ボードの公開設定 |
| columns | Column | カンバンカラム |
| cards | Card | タスクカード |
| card_activity_spikes | CardActivitySpike | カードのアクティビティスパイク |
| card_goldnesses | CardGoldness | カードのゴールデンマーク |
| card_not_nows | CardNotNow | カードの保留状態 |
| comments | Comment | コメント |
| tags | Tag | タグ |
| taggings | Tagging | カードとタグの関連付け |
| assignments | Assignment | カードへのユーザー割り当て |
| closures | Closure | カードのクローズ情報 |
| steps | Step | カード内のチェックリストステップ |
| accesses | Access | ボードへのアクセス記録 |
| watches | Watch | カードのウォッチ（購読）設定 |
| pins | Pin | カードのピン留め |
| mentions | Mention | メンション情報 |
| reactions | Reaction | リアクション（絵文字） |
| events | Event | イベントログ |
| notifications | Notification | 通知 |
| notification_bundles | NotificationBundle | 通知バンドル（メール配信用） |
| filters | Filter | 保存済み検索フィルター |
| assignees_filters | - | フィルターと担当者の中間テーブル |
| assigners_filters | - | フィルターと割り当て者の中間テーブル |
| boards_filters | - | フィルターとボードの中間テーブル |
| closers_filters | - | フィルターとクローズ者の中間テーブル |
| creators_filters | - | フィルターと作成者の中間テーブル |
| filters_tags | - | フィルターとタグの中間テーブル |
| exports | Export | データエクスポート情報 |
| webhooks | Webhook | Webhook設定 |
| webhook_deliveries | Webhook::Delivery | Webhook配信履歴 |
| webhook_delinquency_trackers | Webhook::DelinquencyTracker | Webhook失敗追跡 |
| push_subscriptions | PushSubscription | Webプッシュ通知購読 |
| search_queries | SearchQuery | 検索履歴 |
| search_records_0〜15 | SearchRecord | 全文検索用インデックステーブル（シャード） |
| entropies | Entropy | 自動延期設定 |
| storage_entries | StorageEntry | ストレージ操作ログ |
| storage_totals | StorageTotal | ストレージ使用量合計 |
| action_text_rich_texts | ActionText::RichText | リッチテキストコンテンツ |
| active_storage_blobs | ActiveStorage::Blob | ファイルBlob |
| active_storage_attachments | ActiveStorage::Attachment | ファイル添付関連付け |
| active_storage_variant_records | ActiveStorage::VariantRecord | 画像バリアント |

## 各テーブル定義

### 1. accounts

アカウント（テナント）の基本情報を管理するテーブル。マルチテナントシステムの中核となるテーブル。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| name | VARCHAR(255) | NO | アカウント名 |
| external_account_id | BIGINT | YES | 外部公開用アカウントID（URLスラッグ生成用） |
| cards_count | BIGINT | NO | カード総数カウンター（デフォルト: 0） |
| created_at | DATETIME | NO | 作成日時 |
| updated_at | DATETIME | NO | 更新日時 |

**インデックス:**
- `index_accounts_on_external_account_id` (UNIQUE)

---

### 2. account_cancellations

アカウントキャンセル（退会）情報を管理するテーブル。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| account_id | UUID | NO | 対象アカウントID |
| initiated_by_id | UUID | NO | キャンセルを開始したユーザーID |
| created_at | DATETIME | NO | 作成日時 |
| updated_at | DATETIME | NO | 更新日時 |

**インデックス:**
- `index_account_cancellations_on_account_id` (UNIQUE)

---

### 3. account_external_id_sequences

外部アカウントIDのシーケンス値を管理するテーブル。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| value | BIGINT | NO | シーケンス値（デフォルト: 0） |

**インデックス:**
- `index_account_external_id_sequences_on_value` (UNIQUE)

---

### 4. account_imports

アカウントのインポート処理状態を管理するテーブル。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| account_id | UUID | YES | インポート先アカウントID |
| identity_id | UUID | NO | インポート実行者のアイデンティティID |
| status | VARCHAR(255) | NO | ステータス（pending/processing/completed/failed） |
| failure_reason | VARCHAR(255) | YES | 失敗理由 |
| completed_at | DATETIME | YES | 完了日時 |
| created_at | DATETIME | NO | 作成日時 |
| updated_at | DATETIME | NO | 更新日時 |

**インデックス:**
- `index_account_imports_on_account_id`
- `index_account_imports_on_identity_id`

---

### 5. account_join_codes

アカウント参加用コードを管理するテーブル。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| account_id | UUID | NO | アカウントID |
| code | VARCHAR(255) | NO | 参加コード |
| usage_count | BIGINT | NO | 使用回数（デフォルト: 0） |
| usage_limit | BIGINT | NO | 使用上限（デフォルト: 10） |
| created_at | DATETIME | NO | 作成日時 |
| updated_at | DATETIME | NO | 更新日時 |

**インデックス:**
- `index_account_join_codes_on_account_id_and_code` (UNIQUE)

---

### 6. identities

認証に使用するアイデンティティ（メールアドレス）を管理するテーブル。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| email_address | VARCHAR(255) | NO | メールアドレス |
| staff | BOOLEAN | NO | スタッフフラグ（デフォルト: false） |
| created_at | DATETIME | NO | 作成日時 |
| updated_at | DATETIME | NO | 更新日時 |

**インデックス:**
- `index_identities_on_email_address` (UNIQUE)

---

### 7. identity_access_tokens

APIアクセストークンを管理するテーブル。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| identity_id | UUID | NO | アイデンティティID |
| token | VARCHAR(255) | YES | アクセストークン |
| permission | VARCHAR(255) | YES | 権限 |
| description | TEXT | YES | 説明 |
| created_at | DATETIME | NO | 作成日時 |
| updated_at | DATETIME | NO | 更新日時 |

**インデックス:**
- `index_access_token_on_identity_id`

---

### 8. users

アカウント内のユーザーを管理するテーブル。1つのIdentityが複数のアカウントで異なるUserを持つことが可能。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| account_id | UUID | NO | 所属アカウントID |
| identity_id | UUID | YES | 紐付くアイデンティティID |
| name | VARCHAR(255) | NO | ユーザー名 |
| role | VARCHAR(255) | NO | ロール（owner/admin/member/system）（デフォルト: member） |
| active | BOOLEAN | NO | アクティブフラグ（デフォルト: true） |
| verified_at | DATETIME | YES | 認証完了日時 |
| created_at | DATETIME | NO | 作成日時 |
| updated_at | DATETIME | NO | 更新日時 |

**インデックス:**
- `index_users_on_account_id_and_identity_id` (UNIQUE)
- `index_users_on_account_id_and_role`
- `index_users_on_identity_id`

---

### 9. user_settings

ユーザー設定を管理するテーブル。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| account_id | UUID | NO | アカウントID |
| user_id | UUID | NO | ユーザーID |
| bundle_email_frequency | INTEGER | NO | メールバンドル頻度（デフォルト: 0） |
| timezone_name | VARCHAR(255) | YES | タイムゾーン名 |
| created_at | DATETIME | NO | 作成日時 |
| updated_at | DATETIME | NO | 更新日時 |

**インデックス:**
- `index_user_settings_on_account_id`
- `index_user_settings_on_user_id`
- `index_user_settings_on_user_id_and_bundle_email_frequency`

---

### 10. sessions

ログインセッションを管理するテーブル。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| identity_id | UUID | NO | アイデンティティID |
| ip_address | VARCHAR(255) | YES | IPアドレス |
| user_agent | VARCHAR(4096) | YES | ユーザーエージェント |
| created_at | DATETIME | NO | 作成日時 |
| updated_at | DATETIME | NO | 更新日時 |

**インデックス:**
- `index_sessions_on_identity_id`

---

### 11. magic_links

マジックリンク認証用のリンク情報を管理するテーブル。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| identity_id | UUID | YES | アイデンティティID |
| code | VARCHAR(255) | NO | マジックリンクコード |
| purpose | INTEGER | NO | 目的（sign_in等） |
| expires_at | DATETIME | NO | 有効期限 |
| created_at | DATETIME | NO | 作成日時 |
| updated_at | DATETIME | NO | 更新日時 |

**インデックス:**
- `index_magic_links_on_code` (UNIQUE)
- `index_magic_links_on_expires_at`
- `index_magic_links_on_identity_id`

---

### 12. boards

ボード（プロジェクト）を管理するテーブル。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| account_id | UUID | NO | アカウントID |
| creator_id | UUID | NO | 作成者ユーザーID |
| name | VARCHAR(255) | NO | ボード名 |
| all_access | BOOLEAN | NO | 全員アクセス可能フラグ（デフォルト: false） |
| created_at | DATETIME | NO | 作成日時 |
| updated_at | DATETIME | NO | 更新日時 |

**インデックス:**
- `index_boards_on_account_id`
- `index_boards_on_creator_id`

---

### 13. board_publications

ボードの公開設定を管理するテーブル。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| account_id | UUID | NO | アカウントID |
| board_id | UUID | NO | ボードID |
| key | VARCHAR(255) | YES | 公開キー |
| created_at | DATETIME | NO | 作成日時 |
| updated_at | DATETIME | NO | 更新日時 |

**インデックス:**
- `index_board_publications_on_account_id`
- `index_board_publications_on_board_id`
- `index_board_publications_on_key` (UNIQUE)

---

### 14. columns

カンバンボードのカラムを管理するテーブル。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| account_id | UUID | NO | アカウントID |
| board_id | UUID | NO | ボードID |
| name | VARCHAR(255) | NO | カラム名 |
| color | VARCHAR(255) | NO | 色 |
| position | INTEGER | NO | 表示順（デフォルト: 0） |
| created_at | DATETIME | NO | 作成日時 |
| updated_at | DATETIME | NO | 更新日時 |

**インデックス:**
- `index_columns_on_account_id`
- `index_columns_on_board_id`
- `index_columns_on_board_id_and_position`

---

### 15. cards

タスクカードを管理するテーブル。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| account_id | UUID | NO | アカウントID |
| board_id | UUID | NO | ボードID |
| column_id | UUID | YES | カラムID |
| creator_id | UUID | NO | 作成者ユーザーID |
| number | BIGINT | NO | カード番号（アカウント内で一意） |
| title | VARCHAR(255) | YES | タイトル |
| status | VARCHAR(255) | NO | ステータス（drafted/published/closed）（デフォルト: drafted） |
| due_on | DATE | YES | 期限日 |
| last_active_at | DATETIME | NO | 最終アクティビティ日時 |
| created_at | DATETIME | NO | 作成日時 |
| updated_at | DATETIME | NO | 更新日時 |

**インデックス:**
- `index_cards_on_account_id_and_number` (UNIQUE)
- `index_cards_on_account_id_and_last_active_at_and_status`
- `index_cards_on_board_id`
- `index_cards_on_column_id`

---

### 16. card_activity_spikes

カードのアクティビティスパイク（急激なアクティビティ増加）を管理するテーブル。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| account_id | UUID | NO | アカウントID |
| card_id | UUID | NO | カードID |
| created_at | DATETIME | NO | 作成日時 |
| updated_at | DATETIME | NO | 更新日時 |

**インデックス:**
- `index_card_activity_spikes_on_account_id`
- `index_card_activity_spikes_on_card_id` (UNIQUE)

---

### 17. card_goldnesses

カードのゴールデンマーク（重要マーク）を管理するテーブル。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| account_id | UUID | NO | アカウントID |
| card_id | UUID | NO | カードID |
| created_at | DATETIME | NO | 作成日時 |
| updated_at | DATETIME | NO | 更新日時 |

**インデックス:**
- `index_card_goldnesses_on_account_id`
- `index_card_goldnesses_on_card_id` (UNIQUE)

---

### 18. card_not_nows

カードの保留（Not Now）状態を管理するテーブル。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| account_id | UUID | NO | アカウントID |
| card_id | UUID | NO | カードID |
| user_id | UUID | YES | 保留設定ユーザーID |
| created_at | DATETIME | NO | 作成日時 |
| updated_at | DATETIME | NO | 更新日時 |

**インデックス:**
- `index_card_not_nows_on_account_id`
- `index_card_not_nows_on_card_id` (UNIQUE)
- `index_card_not_nows_on_user_id`

---

### 19. comments

カードへのコメントを管理するテーブル。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| account_id | UUID | NO | アカウントID |
| card_id | UUID | NO | カードID |
| creator_id | UUID | NO | 作成者ユーザーID |
| created_at | DATETIME | NO | 作成日時 |
| updated_at | DATETIME | NO | 更新日時 |

**インデックス:**
- `index_comments_on_account_id`
- `index_comments_on_card_id`

---

### 20. tags

タグを管理するテーブル。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| account_id | UUID | NO | アカウントID |
| title | VARCHAR(255) | YES | タグ名 |
| created_at | DATETIME | NO | 作成日時 |
| updated_at | DATETIME | NO | 更新日時 |

**インデックス:**
- `index_tags_on_account_id_and_title` (UNIQUE)

---

### 21. taggings

カードとタグの関連を管理する中間テーブル。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| account_id | UUID | NO | アカウントID |
| card_id | UUID | NO | カードID |
| tag_id | UUID | NO | タグID |
| created_at | DATETIME | NO | 作成日時 |
| updated_at | DATETIME | NO | 更新日時 |

**インデックス:**
- `index_taggings_on_account_id`
- `index_taggings_on_card_id_and_tag_id` (UNIQUE)
- `index_taggings_on_tag_id`

---

### 22. assignments

カードへのユーザー割り当てを管理するテーブル。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| account_id | UUID | NO | アカウントID |
| card_id | UUID | NO | カードID |
| assignee_id | UUID | NO | 担当者ユーザーID |
| assigner_id | UUID | NO | 割り当て者ユーザーID |
| created_at | DATETIME | NO | 作成日時 |
| updated_at | DATETIME | NO | 更新日時 |

**インデックス:**
- `index_assignments_on_account_id`
- `index_assignments_on_assignee_id_and_card_id` (UNIQUE)
- `index_assignments_on_card_id`

---

### 23. closures

カードのクローズ情報を管理するテーブル。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| account_id | UUID | NO | アカウントID |
| card_id | UUID | NO | カードID |
| user_id | UUID | YES | クローズしたユーザーID |
| created_at | DATETIME | NO | 作成日時 |
| updated_at | DATETIME | NO | 更新日時 |

**インデックス:**
- `index_closures_on_account_id`
- `index_closures_on_card_id` (UNIQUE)
- `index_closures_on_card_id_and_created_at`
- `index_closures_on_user_id`

---

### 24. steps

カード内のチェックリストステップを管理するテーブル。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| account_id | UUID | NO | アカウントID |
| card_id | UUID | NO | カードID |
| content | TEXT | NO | ステップ内容 |
| completed | BOOLEAN | NO | 完了フラグ（デフォルト: false） |
| created_at | DATETIME | NO | 作成日時 |
| updated_at | DATETIME | NO | 更新日時 |

**インデックス:**
- `index_steps_on_account_id`
- `index_steps_on_card_id`
- `index_steps_on_card_id_and_completed`

---

### 25. accesses

ボードへのアクセス記録を管理するテーブル。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| account_id | UUID | NO | アカウントID |
| board_id | UUID | NO | ボードID |
| user_id | UUID | NO | ユーザーID |
| involvement | VARCHAR(255) | NO | 関与レベル（デフォルト: access_only） |
| accessed_at | DATETIME | YES | アクセス日時 |
| created_at | DATETIME | NO | 作成日時 |
| updated_at | DATETIME | NO | 更新日時 |

**インデックス:**
- `index_accesses_on_account_id_and_accessed_at`
- `index_accesses_on_board_id`
- `index_accesses_on_board_id_and_user_id` (UNIQUE)
- `index_accesses_on_user_id`

---

### 26. watches

カードのウォッチ（購読）設定を管理するテーブル。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| account_id | UUID | NO | アカウントID |
| card_id | UUID | NO | カードID |
| user_id | UUID | NO | ユーザーID |
| watching | BOOLEAN | NO | ウォッチ中フラグ（デフォルト: true） |
| created_at | DATETIME | NO | 作成日時 |
| updated_at | DATETIME | NO | 更新日時 |

**インデックス:**
- `index_watches_on_account_id`
- `index_watches_on_card_id`
- `index_watches_on_user_id`
- `index_watches_on_user_id_and_card_id`

---

### 27. pins

カードのピン留めを管理するテーブル。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| account_id | UUID | NO | アカウントID |
| card_id | UUID | NO | カードID |
| user_id | UUID | NO | ユーザーID |
| created_at | DATETIME | NO | 作成日時 |
| updated_at | DATETIME | NO | 更新日時 |

**インデックス:**
- `index_pins_on_account_id`
- `index_pins_on_card_id`
- `index_pins_on_card_id_and_user_id` (UNIQUE)
- `index_pins_on_user_id`

---

### 28. mentions

メンション情報を管理するテーブル。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| account_id | UUID | NO | アカウントID |
| mentioner_id | UUID | NO | メンションしたユーザーID |
| mentionee_id | UUID | NO | メンションされたユーザーID |
| source_type | VARCHAR(255) | NO | メンション元タイプ |
| source_id | UUID | NO | メンション元ID |
| created_at | DATETIME | NO | 作成日時 |
| updated_at | DATETIME | NO | 更新日時 |

**インデックス:**
- `index_mentions_on_account_id`
- `index_mentions_on_mentionee_id`
- `index_mentions_on_mentioner_id`
- `index_mentions_on_source`

---

### 29. reactions

リアクション（絵文字）を管理するテーブル。ポリモーフィック関連でカードやコメントに対応。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| account_id | UUID | NO | アカウントID |
| reactable_type | VARCHAR(255) | NO | リアクション対象タイプ（Card/Comment） |
| reactable_id | UUID | NO | リアクション対象ID |
| reacter_id | UUID | NO | リアクションしたユーザーID |
| content | VARCHAR(16) | NO | リアクション内容（絵文字） |
| created_at | DATETIME | NO | 作成日時 |
| updated_at | DATETIME | NO | 更新日時 |

**インデックス:**
- `index_reactions_on_account_id`
- `index_reactions_on_reactable_type_and_reactable_id`
- `index_reactions_on_reacter_id`

---

### 30. events

システム内のイベントログを管理するテーブル。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| account_id | UUID | NO | アカウントID |
| board_id | UUID | NO | ボードID |
| creator_id | UUID | NO | イベント作成者ユーザーID |
| eventable_type | VARCHAR(255) | NO | イベント対象タイプ |
| eventable_id | UUID | NO | イベント対象ID |
| action | VARCHAR(255) | NO | アクション名 |
| particulars | JSON | YES | 詳細情報（デフォルト: {}） |
| created_at | DATETIME | NO | 作成日時 |
| updated_at | DATETIME | NO | 更新日時 |

**インデックス:**
- `index_events_on_account_id_and_action`
- `index_events_on_board_id`
- `index_events_on_board_id_and_action_and_created_at`
- `index_events_on_creator_id`
- `index_events_on_eventable`

---

### 31. notifications

ユーザーへの通知を管理するテーブル。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| account_id | UUID | NO | アカウントID |
| user_id | UUID | NO | 通知先ユーザーID |
| creator_id | UUID | YES | 通知作成者ユーザーID |
| card_id | UUID | NO | 対象カードID |
| source_type | VARCHAR(255) | NO | 通知元タイプ |
| source_id | UUID | NO | 通知元ID |
| read_at | DATETIME | YES | 既読日時 |
| unread_count | INTEGER | NO | 未読数（デフォルト: 0） |
| created_at | DATETIME | NO | 作成日時 |
| updated_at | DATETIME | NO | 更新日時 |

**インデックス:**
- `index_notifications_on_account_id`
- `index_notifications_on_creator_id`
- `index_notifications_on_source`
- `index_notifications_on_user_id`
- `index_notifications_on_user_id_and_card_id` (UNIQUE)
- `index_notifications_on_user_id_and_read_at_and_updated_at`

---

### 32. notification_bundles

メール配信用の通知バンドルを管理するテーブル。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| account_id | UUID | NO | アカウントID |
| user_id | UUID | NO | ユーザーID |
| status | INTEGER | NO | ステータス（デフォルト: 0） |
| starts_at | DATETIME | NO | バンドル開始日時 |
| ends_at | DATETIME | NO | バンドル終了日時 |
| created_at | DATETIME | NO | 作成日時 |
| updated_at | DATETIME | NO | 更新日時 |

**インデックス:**
- `index_notification_bundles_on_account_id`
- `index_notification_bundles_on_ends_at_and_status`
- `index_notification_bundles_on_user_id_and_starts_at_and_ends_at`
- `index_notification_bundles_on_user_id_and_status`

---

### 33. filters

保存済み検索フィルターを管理するテーブル。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| account_id | UUID | NO | アカウントID |
| creator_id | UUID | NO | 作成者ユーザーID |
| params_digest | VARCHAR(255) | NO | パラメータダイジェスト |
| fields | JSON | NO | フィルターフィールド（デフォルト: {}） |
| created_at | DATETIME | NO | 作成日時 |
| updated_at | DATETIME | NO | 更新日時 |

**インデックス:**
- `index_filters_on_account_id`
- `index_filters_on_creator_id_and_params_digest` (UNIQUE)

---

### 34-38. フィルター中間テーブル

フィルターと各種エンティティの関連を管理する中間テーブル群。

#### assignees_filters

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| assignee_id | UUID | NO | 担当者ユーザーID |
| filter_id | UUID | NO | フィルターID |

#### assigners_filters

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| assigner_id | UUID | NO | 割り当て者ユーザーID |
| filter_id | UUID | NO | フィルターID |

#### boards_filters

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| board_id | UUID | NO | ボードID |
| filter_id | UUID | NO | フィルターID |

#### closers_filters

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| closer_id | UUID | NO | クローズ者ユーザーID |
| filter_id | UUID | NO | フィルターID |

#### creators_filters

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| creator_id | UUID | NO | 作成者ユーザーID |
| filter_id | UUID | NO | フィルターID |

#### filters_tags

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| filter_id | UUID | NO | フィルターID |
| tag_id | UUID | NO | タグID |

---

### 39. exports

データエクスポート情報を管理するテーブル。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| account_id | UUID | NO | アカウントID |
| user_id | UUID | NO | エクスポート要求ユーザーID |
| type | VARCHAR(255) | YES | エクスポートタイプ（STI用） |
| status | VARCHAR(255) | NO | ステータス（デフォルト: pending） |
| completed_at | DATETIME | YES | 完了日時 |
| created_at | DATETIME | NO | 作成日時 |
| updated_at | DATETIME | NO | 更新日時 |

**インデックス:**
- `index_exports_on_account_id`
- `index_exports_on_type`
- `index_exports_on_user_id`

---

### 40. webhooks

Webhook設定を管理するテーブル。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| account_id | UUID | NO | アカウントID |
| board_id | UUID | NO | ボードID |
| name | VARCHAR(255) | YES | Webhook名 |
| url | TEXT | NO | 送信先URL |
| signing_secret | VARCHAR(255) | NO | 署名シークレット |
| subscribed_actions | TEXT | YES | 購読アクション |
| active | BOOLEAN | NO | アクティブフラグ（デフォルト: true） |
| created_at | DATETIME | NO | 作成日時 |
| updated_at | DATETIME | NO | 更新日時 |

**インデックス:**
- `index_webhooks_on_account_id`
- `index_webhooks_on_board_id_and_subscribed_actions`

---

### 41. webhook_deliveries

Webhook配信履歴を管理するテーブル。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| account_id | UUID | NO | アカウントID |
| webhook_id | UUID | NO | WebhookID |
| event_id | UUID | NO | イベントID |
| state | VARCHAR(255) | NO | 配信状態 |
| request | TEXT | YES | リクエスト内容 |
| response | TEXT | YES | レスポンス内容 |
| created_at | DATETIME | NO | 作成日時 |
| updated_at | DATETIME | NO | 更新日時 |

**インデックス:**
- `index_webhook_deliveries_on_account_id`
- `index_webhook_deliveries_on_created_at`
- `index_webhook_deliveries_on_event_id`
- `index_webhook_deliveries_on_webhook_id`

---

### 42. webhook_delinquency_trackers

Webhookの失敗追跡を管理するテーブル。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| account_id | UUID | NO | アカウントID |
| webhook_id | UUID | NO | WebhookID |
| consecutive_failures_count | INTEGER | YES | 連続失敗回数（デフォルト: 0） |
| first_failure_at | DATETIME | YES | 最初の失敗日時 |
| created_at | DATETIME | NO | 作成日時 |
| updated_at | DATETIME | NO | 更新日時 |

**インデックス:**
- `index_webhook_delinquency_trackers_on_account_id`
- `index_webhook_delinquency_trackers_on_webhook_id`

---

### 43. push_subscriptions

Webプッシュ通知購読を管理するテーブル。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| account_id | UUID | NO | アカウントID |
| user_id | UUID | NO | ユーザーID |
| endpoint | TEXT | YES | プッシュエンドポイントURL |
| p256dh_key | VARCHAR(255) | YES | 公開鍵 |
| auth_key | VARCHAR(255) | YES | 認証キー |
| user_agent | VARCHAR(4096) | YES | ユーザーエージェント |
| created_at | DATETIME | NO | 作成日時 |
| updated_at | DATETIME | NO | 更新日時 |

**インデックス:**
- `index_push_subscriptions_on_account_id`
- `index_push_subscriptions_on_user_id_and_endpoint` (UNIQUE)

---

### 44. search_queries

検索履歴を管理するテーブル。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| account_id | UUID | NO | アカウントID |
| user_id | UUID | NO | ユーザーID |
| terms | VARCHAR(2000) | NO | 検索語 |
| created_at | DATETIME | NO | 作成日時 |
| updated_at | DATETIME | NO | 更新日時 |

**インデックス:**
- `index_search_queries_on_account_id`
- `index_search_queries_on_user_id`
- `index_search_queries_on_user_id_and_terms`
- `index_search_queries_on_user_id_and_updated_at` (UNIQUE)

---

### 45. search_records_0〜15

全文検索用インデックステーブル（シャード0〜15）。パフォーマンス向上のため16テーブルに分割。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| account_id | UUID | NO | アカウントID |
| account_key | VARCHAR(255) | NO | アカウントキー（デフォルト: ""） |
| board_id | UUID | NO | ボードID |
| card_id | UUID | NO | カードID |
| searchable_type | VARCHAR(255) | NO | 検索対象タイプ |
| searchable_id | UUID | NO | 検索対象ID |
| title | VARCHAR(255) | YES | タイトル |
| content | TEXT | YES | コンテンツ |
| created_at | DATETIME | NO | 作成日時 |

**インデックス:**
- `index_search_records_N_on_account_id`
- `index_search_records_N_on_account_key_and_content_and_title` (FULLTEXT)
- `index_search_records_N_on_searchable_type_and_searchable_id` (UNIQUE)

---

### 46. entropies

自動延期設定を管理するテーブル。ボードまたはアカウント単位で設定可能。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| account_id | UUID | NO | アカウントID |
| container_type | VARCHAR(255) | NO | 設定対象タイプ（Board/Account） |
| container_id | UUID | NO | 設定対象ID |
| auto_postpone_period | BIGINT | NO | 自動延期期間（秒、デフォルト: 2592000 = 30日） |
| created_at | DATETIME | NO | 作成日時 |
| updated_at | DATETIME | NO | 更新日時 |

**インデックス:**
- `index_entropies_on_account_id`
- `index_entropy_configurations_on_container` (UNIQUE)
- `idx_on_container_type_container_id_auto_postpone_period`

---

### 47. storage_entries

ストレージ操作ログを管理するテーブル。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| account_id | UUID | NO | アカウントID |
| board_id | UUID | YES | ボードID |
| user_id | UUID | YES | ユーザーID |
| blob_id | UUID | YES | BlobID |
| recordable_type | VARCHAR(255) | YES | 対象タイプ |
| recordable_id | UUID | YES | 対象ID |
| operation | VARCHAR(255) | NO | 操作種別 |
| delta | BIGINT | NO | サイズ変化量 |
| request_id | VARCHAR(255) | YES | リクエストID |
| created_at | DATETIME | NO | 作成日時 |

**インデックス:**
- `index_storage_entries_on_account_id`
- `index_storage_entries_on_blob_id`
- `index_storage_entries_on_board_id`
- `index_storage_entries_on_recordable`
- `index_storage_entries_on_request_id`
- `index_storage_entries_on_user_id`

---

### 48. storage_totals

ストレージ使用量合計を管理するテーブル。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| owner_type | VARCHAR(255) | NO | 所有者タイプ（Account/Board） |
| owner_id | UUID | NO | 所有者ID |
| bytes_stored | BIGINT | NO | 保存バイト数（デフォルト: 0） |
| last_entry_id | UUID | YES | 最後のエントリID |
| created_at | DATETIME | NO | 作成日時 |
| updated_at | DATETIME | NO | 更新日時 |

**インデックス:**
- `index_storage_totals_on_owner_type_and_owner_id` (UNIQUE)

---

### 49. action_text_rich_texts

ActionTextリッチテキストコンテンツを管理するテーブル。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| account_id | UUID | NO | アカウントID |
| name | VARCHAR(255) | NO | フィールド名 |
| body | LONGTEXT | YES | リッチテキスト本文 |
| record_type | VARCHAR(255) | NO | 関連レコードタイプ |
| record_id | UUID | NO | 関連レコードID |
| created_at | DATETIME | NO | 作成日時 |
| updated_at | DATETIME | NO | 更新日時 |

**インデックス:**
- `index_action_text_rich_texts_on_account_id`
- `index_action_text_rich_texts_uniqueness` (UNIQUE)

---

### 50. active_storage_blobs

ActiveStorageファイルBlobを管理するテーブル。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| account_id | UUID | NO | アカウントID |
| key | VARCHAR(255) | NO | ストレージキー |
| filename | VARCHAR(255) | NO | ファイル名 |
| content_type | VARCHAR(255) | YES | コンテンツタイプ |
| metadata | TEXT | YES | メタデータ |
| byte_size | BIGINT | NO | ファイルサイズ |
| checksum | VARCHAR(255) | YES | チェックサム |
| service_name | VARCHAR(255) | NO | ストレージサービス名 |
| created_at | DATETIME | NO | 作成日時 |

**インデックス:**
- `index_active_storage_blobs_on_account_id`
- `index_active_storage_blobs_on_key` (UNIQUE)

---

### 51. active_storage_attachments

ActiveStorageファイル添付を管理するテーブル。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| account_id | UUID | NO | アカウントID |
| name | VARCHAR(255) | NO | 添付名 |
| record_type | VARCHAR(255) | NO | 関連レコードタイプ |
| record_id | UUID | NO | 関連レコードID |
| blob_id | UUID | NO | BlobID |
| created_at | DATETIME | NO | 作成日時 |

**インデックス:**
- `index_active_storage_attachments_on_account_id`
- `index_active_storage_attachments_on_blob_id`
- `index_active_storage_attachments_uniqueness` (UNIQUE)

---

### 52. active_storage_variant_records

ActiveStorage画像バリアントを管理するテーブル。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | UUID | NO | 主キー |
| account_id | UUID | NO | アカウントID |
| blob_id | UUID | NO | BlobID |
| variation_digest | VARCHAR(255) | NO | バリアントダイジェスト |

**インデックス:**
- `index_active_storage_variant_records_on_account_id`
- `index_active_storage_variant_records_uniqueness` (UNIQUE)

## 備考

### マルチテナント対応
- ほぼ全てのテーブルにaccount_idカラムを持たせ、データの論理的な分離を実現
- 外部キー制約は使用せず、アプリケーションレベルでリレーションシップを管理

### UUID採用
- 全テーブルでUUIDを主キーとして使用
- 分散システムでのID衝突を回避し、セキュリティも向上

### 検索機能
- MySQLのFULLTEXTインデックスを使用
- パフォーマンス向上のため16シャードに分割（search_records_0〜15）

### リッチテキスト
- Rails ActionTextを使用
- カードの説明、コメント本文、ボードの公開説明文に対応

### ファイルストレージ
- Rails ActiveStorageを使用
- ユーザーアバター、カード画像などに対応
- ストレージ使用量を追跡（storage_entries/storage_totals）
