# ER図

## 概要

本ドキュメントは、Payload CMS のデータベース構造を ER 図で表現したものです。Payload は動的にスキーマを生成するため、本図は一般的なコレクションにおけるテーブル構造のパターンを示しています。

## コレクション基本構造

以下は、一般的なコレクションにおけるテーブル関係を示す ER 図です。

```mermaid
erDiagram
    COLLECTION ||--o{ COLLECTION_LOCALES : "has localized fields"
    COLLECTION ||--o{ COLLECTION_RELS : "has relationships"
    COLLECTION ||--o{ COLLECTION_TEXTS : "has many texts"
    COLLECTION ||--o{ COLLECTION_NUMBERS : "has many numbers"
    COLLECTION ||--o{ COLLECTION_ARRAY : "has array items"
    COLLECTION ||--o{ COLLECTION_BLOCKS_BLOCK : "has blocks"
    COLLECTION ||--o{ COLLECTION_SELECT : "has many selects"
    COLLECTION ||--o{ COLLECTION_V : "has versions"

    COLLECTION {
        serial id PK
        timestamp created_at
        timestamp updated_at
        varchar field_text
        numeric field_number
        boolean field_checkbox
        timestamp field_date
        jsonb field_json
        enum field_select
        integer related_id FK
    }

    COLLECTION_LOCALES {
        serial id PK
        enum _locale
        integer _parent_id FK
        varchar localized_text
        jsonb localized_richtext
    }

    COLLECTION_RELS {
        serial id PK
        integer order
        integer parent_id FK
        varchar path
        enum locale
        integer related_collection_id FK
    }

    COLLECTION_TEXTS {
        serial id PK
        integer order
        integer parent_id FK
        varchar path
        varchar text
        enum locale
    }

    COLLECTION_NUMBERS {
        serial id PK
        integer order
        integer parent_id FK
        varchar path
        numeric number
        enum locale
    }

    COLLECTION_ARRAY {
        serial id PK
        integer _order
        integer _parent_id FK
        enum _locale
        varchar array_field_1
        numeric array_field_2
    }

    COLLECTION_BLOCKS_BLOCK {
        serial id PK
        integer _order
        integer _parent_id FK
        text _path
        enum _locale
        varchar block_field_1
        numeric block_field_2
    }

    COLLECTION_SELECT {
        serial id PK
        integer order
        integer parent_id FK
        enum value
        enum locale
    }

    COLLECTION_V {
        serial id PK
        integer parent FK
        jsonb version
        timestamp created_at
        timestamp updated_at
        boolean latest
        boolean autosave
    }
```

## リレーションシップパターン

### 単一リレーションシップ

```mermaid
erDiagram
    POSTS ||--o| CATEGORIES : "belongs to"

    POSTS {
        serial id PK
        varchar title
        integer category_id FK
    }

    CATEGORIES {
        serial id PK
        varchar name
    }
```

### hasMany リレーションシップ

```mermaid
erDiagram
    POSTS ||--o{ POSTS_RELS : "has many"
    POSTS_RELS }o--|| TAGS : "references"

    POSTS {
        serial id PK
        varchar title
    }

    POSTS_RELS {
        serial id PK
        integer order
        integer parent_id FK
        varchar path
        integer tags_id FK
    }

    TAGS {
        serial id PK
        varchar name
    }
```

### Polymorphic リレーションシップ

```mermaid
erDiagram
    PAGES ||--o{ PAGES_RELS : "has polymorphic"
    PAGES_RELS }o--o| POSTS : "references"
    PAGES_RELS }o--o| PRODUCTS : "references"

    PAGES {
        serial id PK
        varchar title
    }

    PAGES_RELS {
        serial id PK
        integer order
        integer parent_id FK
        varchar path
        integer posts_id FK
        integer products_id FK
    }

    POSTS {
        serial id PK
        varchar title
    }

    PRODUCTS {
        serial id PK
        varchar name
    }
```

## ローカライズパターン

```mermaid
erDiagram
    PAGES ||--o{ PAGES_LOCALES : "has localized"

    PAGES {
        serial id PK
        varchar slug
        timestamp created_at
        timestamp updated_at
    }

    PAGES_LOCALES {
        serial id PK
        enum _locale
        integer _parent_id FK
        varchar title
        jsonb content
        varchar meta_title
        varchar meta_description
    }
```

## 配列フィールドパターン

### 基本的な配列

```mermaid
erDiagram
    PAGES ||--o{ PAGES_ITEMS : "has items"

    PAGES {
        serial id PK
        varchar title
    }

    PAGES_ITEMS {
        serial id PK
        integer _order
        integer _parent_id FK
        varchar item_title
        varchar item_description
        varchar item_link
    }
```

### ローカライズされた配列

```mermaid
erDiagram
    PAGES ||--o{ PAGES_ITEMS : "has items"
    PAGES_ITEMS ||--o{ PAGES_ITEMS_LOCALES : "has localized"

    PAGES {
        serial id PK
        varchar slug
    }

    PAGES_ITEMS {
        serial id PK
        integer _order
        integer _parent_id FK
        enum _locale
        varchar image
    }

    PAGES_ITEMS_LOCALES {
        serial id PK
        enum _locale
        integer _parent_id FK
        varchar title
        varchar description
    }
```

### ネストした配列

```mermaid
erDiagram
    PAGES ||--o{ PAGES_SECTIONS : "has sections"
    PAGES_SECTIONS ||--o{ PAGES_SECTIONS_ITEMS : "has items"

    PAGES {
        serial id PK
        varchar title
    }

    PAGES_SECTIONS {
        serial id PK
        integer _order
        integer _parent_id FK
        varchar section_title
    }

    PAGES_SECTIONS_ITEMS {
        serial id PK
        integer _order
        integer _parent_id FK
        varchar item_content
    }
```

## ブロックフィールドパターン

```mermaid
erDiagram
    PAGES ||--o{ PAGES_BLOCKS_HERO : "has hero blocks"
    PAGES ||--o{ PAGES_BLOCKS_CONTENT : "has content blocks"
    PAGES ||--o{ PAGES_BLOCKS_CTA : "has cta blocks"

    PAGES {
        serial id PK
        varchar slug
        timestamp created_at
        timestamp updated_at
    }

    PAGES_BLOCKS_HERO {
        serial id PK
        integer _order
        integer _parent_id FK
        text _path
        varchar heading
        varchar subheading
        integer background_image_id FK
    }

    PAGES_BLOCKS_CONTENT {
        serial id PK
        integer _order
        integer _parent_id FK
        text _path
        jsonb content
        enum alignment
    }

    PAGES_BLOCKS_CTA {
        serial id PK
        integer _order
        integer _parent_id FK
        text _path
        varchar button_text
        varchar button_link
        enum style
    }
```

## グループフィールドパターン

グループフィールドは別テーブルではなく、プレフィックス付きカラムとしてメインテーブルに格納されます。

```mermaid
erDiagram
    POSTS {
        serial id PK
        varchar title
        jsonb content
        varchar meta_title "group: meta"
        varchar meta_description "group: meta"
        varchar meta_keywords "group: meta"
        boolean settings_featured "group: settings"
        enum settings_status "group: settings"
    }
```

## バージョン管理パターン

```mermaid
erDiagram
    POSTS ||--o{ POSTS_V : "has versions"

    POSTS {
        serial id PK
        varchar title
        jsonb content
        enum _status
        timestamp created_at
        timestamp updated_at
    }

    POSTS_V {
        serial id PK
        integer parent FK
        jsonb version
        timestamp created_at
        timestamp updated_at
        boolean latest
        boolean autosave
        varchar published_locale
        boolean snapshot
    }
```

## 認証コレクションパターン

ユーザーなどの認証が有効なコレクションでは、追加のフィールドが含まれます。

```mermaid
erDiagram
    USERS {
        serial id PK
        varchar email UK
        varchar hash
        varchar salt
        timestamp lock_until
        integer login_attempts
        varchar reset_password_token
        timestamp reset_password_expiration
        varchar name
        enum role
        timestamp created_at
        timestamp updated_at
    }
```

## アップロードコレクションパターン

アップロードが有効なコレクションでは、ファイル関連のフィールドが追加されます。

```mermaid
erDiagram
    MEDIA ||--o{ MEDIA_SIZES : "has sizes"

    MEDIA {
        serial id PK
        varchar filename
        varchar mime_type
        integer filesize
        integer width
        integer height
        varchar focal_x
        varchar focal_y
        varchar alt
        varchar url
        varchar thumbnail_url
        timestamp created_at
        timestamp updated_at
    }

    MEDIA_SIZES {
        serial id PK
        integer _parent_id FK
        varchar size_name
        varchar filename
        varchar mime_type
        integer filesize
        integer width
        integer height
        varchar url
    }
```

## システムテーブル

```mermaid
erDiagram
    PAYLOAD_LOCKED_DOCUMENTS {
        serial id PK
        varchar document_id
        varchar collection_slug
        varchar global_slug
        varchar user_id
        timestamp created_at
        timestamp updated_at
    }

    PAYLOAD_PREFERENCES {
        serial id PK
        varchar key
        jsonb value
        integer user_id FK
        timestamp created_at
        timestamp updated_at
    }

    PAYLOAD_MIGRATIONS {
        serial id PK
        varchar name
        varchar batch
        timestamp created_at
        timestamp updated_at
    }
```

## 備考

- 上記の ER 図は一般的なパターンを示しています。実際のスキーマはコレクション設定により異なります。
- `serial` は PostgreSQL の自動増分整数型を示しています。SQLite では `integer` + `autoincrement`、UUID を使用する場合は `uuid` 型になります。
- `enum` は PostgreSQL のネイティブ enum 型を示しています。SQLite では `text` + `CHECK` 制約で実装されます。
- 外部キー制約は `CASCADE` 削除が設定されています (リレーションシップカラムは `SET NULL`)。
