# ER図

## 概要

本ドキュメントは、Laravel Framework 12.x のシステムテーブルおよびEloquent規約に基づく標準的なテーブル構造のER図です。

## システムテーブル

Laravel Frameworkが内部的に使用するシステムテーブルのER図です。

```mermaid
erDiagram
    migrations {
        int id PK "主キー(自動採番)"
        string migration "マイグレーションファイル名"
        int batch "バッチ番号"
    }
```

## Eloquent Model 標準構造

Eloquent ORMが期待する標準的なテーブル構造パターンです。

### 基本テーブル構造

```mermaid
erDiagram
    STANDARD_TABLE {
        bigint id PK "主キー(自動採番)"
        timestamp created_at "作成日時"
        timestamp updated_at "更新日時"
    }
```

### 論理削除対応テーブル構造

SoftDeletesトレイトを使用する場合の構造:

```mermaid
erDiagram
    SOFT_DELETABLE_TABLE {
        bigint id PK "主キー(自動採番)"
        timestamp created_at "作成日時"
        timestamp updated_at "更新日時"
        timestamp deleted_at "削除日時(NULL許容)"
    }
```

### 認証ユーザーテーブル構造

標準的なユーザー認証テーブルの構造:

```mermaid
erDiagram
    USERS_TABLE {
        bigint id PK "主キー(自動採番)"
        string name "ユーザー名"
        string email UK "メールアドレス(ユニーク)"
        timestamp email_verified_at "メール認証日時"
        string password "パスワードハッシュ"
        string remember_token "リメンバートークン"
        timestamp created_at "作成日時"
        timestamp updated_at "更新日時"
    }
```

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

### 1対多リレーション

```mermaid
erDiagram
    PARENT_TABLE ||--o{ CHILD_TABLE : "has many"

    PARENT_TABLE {
        bigint id PK "主キー"
        timestamp created_at "作成日時"
        timestamp updated_at "更新日時"
    }

    CHILD_TABLE {
        bigint id PK "主キー"
        bigint parent_table_id FK "外部キー"
        timestamp created_at "作成日時"
        timestamp updated_at "更新日時"
    }
```

### 多対多リレーション（中間テーブル）

```mermaid
erDiagram
    TABLE_A ||--o{ PIVOT_TABLE : "belongs to many"
    TABLE_B ||--o{ PIVOT_TABLE : "belongs to many"

    TABLE_A {
        bigint id PK "主キー"
        timestamp created_at "作成日時"
        timestamp updated_at "更新日時"
    }

    TABLE_B {
        bigint id PK "主キー"
        timestamp created_at "作成日時"
        timestamp updated_at "更新日時"
    }

    PIVOT_TABLE {
        bigint table_a_id FK "外部キー(TABLE_A)"
        bigint table_b_id FK "外部キー(TABLE_B)"
        timestamp created_at "作成日時(オプション)"
        timestamp updated_at "更新日時(オプション)"
    }
```

### ポリモーフィックリレーション

```mermaid
erDiagram
    COMMENTABLE_A ||--o{ COMMENTS : "morphMany"
    COMMENTABLE_B ||--o{ COMMENTS : "morphMany"

    COMMENTABLE_A {
        bigint id PK "主キー"
        timestamp created_at "作成日時"
        timestamp updated_at "更新日時"
    }

    COMMENTABLE_B {
        bigint id PK "主キー"
        timestamp created_at "作成日時"
        timestamp updated_at "更新日時"
    }

    COMMENTS {
        bigint id PK "主キー"
        text body "コメント本文"
        string commentable_type "対象モデルタイプ"
        bigint commentable_id "対象モデルID"
        timestamp created_at "作成日時"
        timestamp updated_at "更新日時"
    }
```

## UUID/ULID を使用した構造

### UUID主キーテーブル

```mermaid
erDiagram
    UUID_TABLE {
        uuid id PK "UUID主キー"
        timestamp created_at "作成日時"
        timestamp updated_at "更新日時"
    }
```

### ULIDテーブル

```mermaid
erDiagram
    ULID_TABLE {
        char26 id PK "ULID主キー"
        timestamp created_at "作成日時"
        timestamp updated_at "更新日時"
    }
```

## HasOneThrough / HasManyThrough パターン

```mermaid
erDiagram
    COUNTRIES ||--o{ USERS : "has many"
    USERS ||--o{ POSTS : "has many"
    COUNTRIES ||--o{ POSTS : "has many through"

    COUNTRIES {
        bigint id PK "主キー"
        string name "国名"
        timestamp created_at "作成日時"
        timestamp updated_at "更新日時"
    }

    USERS {
        bigint id PK "主キー"
        bigint country_id FK "国ID"
        string name "ユーザー名"
        timestamp created_at "作成日時"
        timestamp updated_at "更新日時"
    }

    POSTS {
        bigint id PK "主キー"
        bigint user_id FK "ユーザーID"
        string title "タイトル"
        timestamp created_at "作成日時"
        timestamp updated_at "更新日時"
    }
```
