# ER図

## 概要

本ドキュメントは、Nim言語コンパイラリポジトリ内のデータベーススキーマをER図（Entity-Relationship Diagram）として可視化したものです。

## Tweeterサンプルアプリケーション

Tweeterサンプルアプリケーションは、Twitter風のマイクロブログサービスを模したシンプルな構成です。ユーザー、フォロー関係、メッセージの3つのテーブルで構成されています。

```mermaid
erDiagram
    User {
        TEXT username PK "ユーザー名"
    }

    Following {
        TEXT follower PK,FK "フォローしているユーザー"
        TEXT followed_user PK,FK "フォローされているユーザー"
    }

    Message {
        TEXT username FK "投稿者"
        INTEGER time "投稿日時(UNIX timestamp)"
        TEXT msg "メッセージ本文(140文字以内)"
    }

    User ||--o{ Following : "follower"
    User ||--o{ Following : "followed_user"
    User ||--o{ Message : "posts"
```

### リレーションシップ説明

| 関係 | カーディナリティ | 説明 |
|------|-----------------|------|
| User - Following (follower) | 1:N | 1人のユーザーは複数のユーザーをフォローできる |
| User - Following (followed_user) | 1:N | 1人のユーザーは複数のユーザーからフォローされる |
| User - Message | 1:N | 1人のユーザーは複数のメッセージを投稿できる |

---

## テスト用SQLスキーマ（参考）

以下はSQLパーサーのテスト用スキーマです。匿名化されたテーブル名・カラム名を使用していますが、ERBを示すことで構造の理解を助けます。

### 主要エンティティ関係図

```mermaid
erDiagram
    anon40 {
        anon42 anon41 PK "主キー"
        TEXT anon44 UK "ユニークテキスト1"
        TEXT anon45 UK "ユニークテキスト2"
        TEXT anon46 "テキスト1"
        TEXT anon47 "テキスト2"
    }

    anon64 {
        SERIAL anon41 PK "主キー"
        VARCHAR30 anon65 UK "識別子"
        VARCHAR30 anon55 UK "コード"
        INT anon70 FK "組織参照"
        BOOLEAN anon69 "有効フラグ"
    }

    anon140 {
        SERIAL anon41 PK "主キー"
        TEXT anon141 UK "識別子"
        INT anon70 FK "組織参照"
        BOOLEAN anon69 "有効フラグ"
    }

    anon40 ||--o{ anon64 : "contains"
    anon40 ||--o{ anon140 : "contains"
```

### 分類階層構造

```mermaid
erDiagram
    anon71 {
        VARCHAR30 anon72 PK "カテゴリコード"
        VARCHAR30 anon73 UK "カテゴリ名"
        INT anon70 FK "組織参照"
    }

    anon74 {
        VARCHAR30 anon72 PK "サブカテゴリコード"
        VARCHAR30 anon73 UK "サブカテゴリ名"
        VARCHAR30 anon75 FK "親カテゴリ参照"
        INT anon70 FK "組織参照"
    }

    anon76 {
        SERIAL anon41 PK "主キー"
        VARCHAR30 anon72 UK "詳細コード"
        VARCHAR30 anon73 UK "詳細名"
        VARCHAR30 anon77 FK "サブカテゴリ参照"
        INT anon70 FK "組織参照"
    }

    anon71 ||--o{ anon74 : "has subcategories"
    anon74 ||--o{ anon76 : "has details"
```

### 勘定/品目関連

```mermaid
erDiagram
    anon94 {
        SERIAL anon41 PK "主キー"
        TEXT anon73 UK "名称"
        INT anon70 FK "組織参照"
        BOOLEAN anon69 "有効フラグ"
    }

    anon95 {
        SERIAL anon41 PK "主キー"
        TEXT anon73 UK "名称"
        INT anon96 FK "親参照"
        INT anon70 FK "組織参照"
    }

    anon97 {
        SERIAL anon41 PK "主キー"
        TEXT anon73 UK "名称"
        INT anon98 FK "親参照"
        INT anon70 FK "組織参照"
    }

    anon82 {
        SERIAL anon41 PK "主キー"
        VARCHAR30 anon72 UK "コード"
        TEXT anon73 UK "名称"
        INT anon79 FK "親参照"
        VARCHAR30 anon83 "タイプ"
        DECIMAL anon84 "金額"
        INT anon70 FK "組織参照"
    }

    anon94 ||--o{ anon95 : "has level2"
    anon95 ||--o{ anon97 : "has level3"
    anon78 ||--o{ anon82 : "contains items"
```

### トランザクション関連

```mermaid
erDiagram
    anon154 {
        SERIAL anon41 PK "主キー"
        INT anon155 UK "伝票番号"
        DATE date "伝票日付"
        INT anon157 FK "取引先参照"
        INT anon158 FK "担当者参照"
        DECIMAL anon159 "金額1"
        DECIMAL anon160 "金額2"
        VARCHAR30 anon170 "ステータス"
        INT anon70 FK "組織参照"
    }

    anon179 {
        SERIAL anon41 PK "主キー"
        INT anon180 FK "伝票参照"
        INT anon181 FK "明細参照"
        INT anon182 FK "品目参照"
        INT anon122 FK "単位参照"
        DECIMAL anon183 "数量"
        DECIMAL anon184 "単価"
        INT anon70 FK "組織参照"
    }

    anon111 {
        SERIAL anon41 PK "主キー"
        TEXT anon112 UK "識別子"
        TEXT anon73 UK "名称"
        INT anon113 FK "分類参照"
        INT anon115 FK "グループ参照"
        INT anon70 FK "組織参照"
    }

    anon125 {
        SERIAL anon41 PK "主キー"
        INT anon126 FK "親参照"
        TEXT anon80 "説明"
        VARCHAR30 anon127 "タイプ"
        INT anon70 FK "組織参照"
    }

    anon154 ||--o{ anon179 : "has details"
    anon111 ||--o{ anon125 : "has items"
    anon140 ||--o{ anon154 : "customer"
    anon64 ||--o{ anon154 : "salesperson"
```

### 単位/レート関連

```mermaid
erDiagram
    anon99 {
        SERIAL anon41 PK "主キー"
        VARCHAR30 anon73 UK "単位名"
        VARCHAR30 anon100 "略称"
        INT anon104 "基準値"
        DECIMAL anon105 "変換率"
        INT anon70 FK "組織参照"
    }

    anon106 {
        VARCHAR30 anon107 "変換タイプ"
        INT anon108 FK "元単位"
        DECIMAL anon109 "変換係数"
        INT anon110 FK "先単位"
        INT anon70 FK "組織参照"
    }

    anon144 {
        SERIAL anon41 PK "主キー"
        VARCHAR30 anon72 UK "税区分コード"
        VARCHAR30 anon73 UK "税区分名"
        INT anon70 FK "組織参照"
    }

    anon145 {
        SERIAL anon41 PK "主キー"
        VARCHAR30 anon72 UK "税率コード"
        VARCHAR30 anon73 UK "税率名"
        INT anon146 FK "税区分参照"
        INT anon150 FK "品目参照"
        INT anon70 FK "組織参照"
    }

    anon99 ||--o{ anon106 : "from_unit"
    anon99 ||--o{ anon106 : "to_unit"
    anon144 ||--o{ anon145 : "has rates"
```

---

## 凡例

| 記号 | 説明 |
|------|------|
| PK | Primary Key（主キー） |
| FK | Foreign Key（外部キー） |
| UK | Unique Key（一意制約） |
| `||--o{` | 1対多の関係 |
| `||--||` | 1対1の関係 |

## 補足

- テスト用SQLスキーマはSQLパーサーの動作テスト用であり、匿名化されたカラム名を使用しています
- 実際の業務システムでは、テーブル名・カラム名は適切な命名規則に従って設定されます
- Tweeterサンプルは学習目的の簡易実装であり、インデックスやパフォーマンス最適化は考慮されていません
