# データベース設計書

## 概要

本ドキュメントは、Ruby on Rails フレームワークのコアコンポーネントが使用するデータベース設計を記述したものです。Rails フレームワークは以下の主要なコンポーネントごとにデータベーステーブルを提供しています：

- **Active Storage**: ファイル添付機能を提供するコンポーネント
- **Action Text**: リッチテキストコンテンツを管理するコンポーネント
- **Action Mailbox**: 受信メール処理機能を提供するコンポーネント

これらのコンポーネントは、Rails アプリケーションにマイグレーションとしてインストールされ、各アプリケーションのデータベースにテーブルを作成します。

## テーブル一覧

| テーブル名 | 対応エンティティ | 説明 |
| --- | --- | --- |
| active_storage_blobs | ActiveStorage::Blob | アップロードされたファイルのメタデータを管理 |
| active_storage_attachments | ActiveStorage::Attachment | ファイルとモデルの関連付けを管理（ポリモーフィック） |
| active_storage_variant_records | ActiveStorage::VariantRecord | 画像バリアント（変換済み画像）の記録を管理 |
| action_text_rich_texts | ActionText::RichText | リッチテキストコンテンツを管理（ポリモーフィック） |
| action_mailbox_inbound_emails | ActionMailbox::InboundEmail | 受信メールの処理状態を管理 |

## 各テーブル定義

### 1. active_storage_blobs

Active Storage でアップロードされたファイルのメタデータを保存するテーブル。ファイル本体は設定されたストレージサービス（ローカル、S3、GCS 等）に保存され、このテーブルにはファイルを識別・取得するための情報が格納されます。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | bigint (PK) | NO | プライマリキー |
| key | string | NO | ストレージサービス上のファイルキー（ユニーク） |
| filename | string | NO | 元のファイル名 |
| content_type | string | YES | MIMEタイプ（例: image/png） |
| metadata | text | YES | ファイルのメタデータ（JSON形式） |
| service_name | string | NO | 使用するストレージサービス名 |
| byte_size | bigint | NO | ファイルサイズ（バイト） |
| checksum | string | YES | ファイルのチェックサム（MD5） |
| created_at | datetime | NO | 作成日時 |

**インデックス:**
- `index_active_storage_blobs_on_key` (key) - ユニーク

### 2. active_storage_attachments

ファイル（Blob）と任意のモデルレコードを関連付ける中間テーブル。ポリモーフィック関連を使用して、任意のモデルにファイルを添付できるようにします。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | bigint (PK) | NO | プライマリキー |
| name | string | NO | 添付の名前（モデルで定義した名前） |
| record_type | string | NO | 関連付けられたモデルのクラス名 |
| record_id | bigint | NO | 関連付けられたモデルのID |
| blob_id | bigint (FK) | NO | 関連付けられたBlobのID |
| created_at | datetime | NO | 作成日時 |

**インデックス:**
- `index_active_storage_attachments_on_blob_id` (blob_id)
- `index_active_storage_attachments_uniqueness` (record_type, record_id, name, blob_id) - ユニーク

**外部キー:**
- `blob_id` -> `active_storage_blobs.id`

### 3. active_storage_variant_records

画像のバリアント（リサイズや変換処理された画像）の記録を保存するテーブル。同じ変換パラメータで再度変換が必要になった場合に、既存のバリアントを再利用できるようにします。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | bigint (PK) | NO | プライマリキー |
| blob_id | bigint (FK) | NO | 元のBlobのID |
| variation_digest | string | NO | 変換パラメータのダイジェスト値 |

**インデックス:**
- `index_active_storage_variant_records_uniqueness` (blob_id, variation_digest) - ユニーク

**外部キー:**
- `blob_id` -> `active_storage_blobs.id`

### 4. action_text_rich_texts

Action Text で管理されるリッチテキストコンテンツを保存するテーブル。Trixエディタで作成されたHTMLコンテンツを格納し、ポリモーフィック関連で任意のモデルに関連付けます。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | bigint (PK) | NO | プライマリキー |
| name | string | NO | リッチテキスト属性の名前 |
| body | text (long) | YES | リッチテキストコンテンツ（HTML） |
| record_type | string | NO | 関連付けられたモデルのクラス名 |
| record_id | bigint | NO | 関連付けられたモデルのID |
| created_at | datetime | NO | 作成日時 |
| updated_at | datetime | NO | 更新日時 |

**インデックス:**
- `index_action_text_rich_texts_uniqueness` (record_type, record_id, name) - ユニーク

### 5. action_mailbox_inbound_emails

Action Mailbox で受信したメールの処理状態を管理するテーブル。受信メールの重複処理を防止し、処理ステータスを追跡します。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| id | bigint (PK) | NO | プライマリキー |
| status | integer | NO | 処理ステータス（0: pending, 1: processing, 2: delivered, 3: failed, 4: bounced） |
| message_id | string | NO | メールのMessage-IDヘッダ値 |
| message_checksum | string | NO | メール内容のチェックサム |
| created_at | datetime | NO | 作成日時 |
| updated_at | datetime | NO | 更新日時 |

**インデックス:**
- `index_action_mailbox_inbound_emails_uniqueness` (message_id, message_checksum) - ユニーク

## 備考

### データ型について

- プライマリキーおよび外部キーのデータ型は、Rails アプリケーションのジェネレータ設定（`config.generators.orm[:primary_key_type]`）に従います。デフォルトでは `bigint` が使用されます。
- `datetime` 型の精度（precision）は、データベースが対応している場合は6（マイクロ秒）が使用されます。

### ポリモーフィック関連

`active_storage_attachments` と `action_text_rich_texts` テーブルは、ポリモーフィック関連を使用しています。これにより、任意のモデルに対してファイルやリッチテキストを関連付けることができます。

- `record_type`: 関連付けられたモデルのクラス名（例: "User", "Post"）
- `record_id`: 関連付けられたモデルのレコードID

### ステータス値（action_mailbox_inbound_emails）

`status` カラムは以下の整数値で処理状態を表します：
- 0: pending（処理待ち）
- 1: processing（処理中）
- 2: delivered（配信完了）
- 3: failed（失敗）
- 4: bounced（バウンス）
