# データベース設計書

## 概要

本ドキュメントは、Nim言語コンパイラリポジトリ内に含まれるデータベース関連コードのスキーマ定義を記述したものです。本プロジェクトはNim言語のコンパイラおよび標準ライブラリを提供するリポジトリであり、データベースはテストおよびサンプルアプリケーション用途で使用されています。

主に以下の2つのデータベーススキーマが存在します:

1. **Tweeterサンプルアプリケーション** - SQLiteを使用したTwitterライクなマイクロブログアプリケーションのサンプル（`tests/niminaction/Chapter7/Tweeter/`）
2. **テスト用SQLスキーマ** - SQLパーサーテスト用の匿名化されたスキーマ（`tests/stdlib/somesql.sql`）

## テーブル一覧

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

| テーブル名 | 対応エンティティ | 説明 |
| --- | --- | --- |
| User | User | ユーザー情報を管理するマスターテーブル |
| Following | - | ユーザー間のフォロー関係を管理する中間テーブル |
| Message | Message | ユーザーが投稿したメッセージを格納するトランザクションテーブル |

### テスト用SQLスキーマ（parsesqlテスト用）

注: このスキーマはSQLパーサーのテスト目的で作成されており、カラム名およびテーブル名は匿名化されています（anon40, anon41等）。実際のアプリケーションで使用されるものではありません。

| テーブル名 | 対応エンティティ | 説明 |
| --- | --- | --- |
| anon40 | - | 主要マスターテーブル（組織情報等と推測） |
| anon64 | - | ユーザー/アカウント情報テーブル |
| anon71 | - | カテゴリマスターテーブル |
| anon74 | - | サブカテゴリテーブル |
| anon76 | - | 分類詳細テーブル |
| anon78 | - | 階層構造を持つ項目テーブル |
| anon82 | - | 勘定/品目マスターテーブル |
| anon88 | - | グループマスターテーブル |
| anon89 | - | 勘定詳細テーブル |
| anon94 | - | 第1階層分類テーブル |
| anon95 | - | 第2階層分類テーブル |
| anon97 | - | 第3階層分類テーブル |
| anon99 | - | 単位/レートマスターテーブル |
| anon106 | - | 単位変換テーブル |
| anon111 | - | 主要トランザクションテーブル |
| anon125 | - | 詳細トランザクションテーブル |
| anon138 | - | 日付付き詳細トランザクションテーブル |
| anon140 | - | 取引先/連絡先マスターテーブル |
| anon144 | - | 税区分マスターテーブル |
| anon145 | - | 税率マスターテーブル |
| anon152 | - | ステータスマスターテーブル |
| anon154 | - | 伝票ヘッダーテーブル |
| anon179 | - | 伝票明細テーブル |
| anon195 | - | 支払情報テーブル |
| anon197 | - | 税金計算テーブル |
| anon201 | - | 権限/設定テーブル |
| anon207 | - | その他設定テーブル |

## 各テーブル定義

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

#### 1. User

ユーザー情報を管理するマスターテーブル。Tweeterアプリケーションの登録ユーザーを格納します。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| username | TEXT | NOT NULL | ユーザー名（主キー） |

**制約:**
- PRIMARY KEY: username

---

#### 2. Following

ユーザー間のフォロー関係を管理する中間テーブル。多対多の関係を表現します。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| follower | TEXT | NOT NULL | フォローしているユーザー名（複合主キー、外部キー） |
| followed_user | TEXT | NOT NULL | フォローされているユーザー名（複合主キー、外部キー） |

**制約:**
- PRIMARY KEY: (follower, followed_user)
- FOREIGN KEY: follower REFERENCES User(username)
- FOREIGN KEY: followed_user REFERENCES User(username)

---

#### 3. Message

ユーザーが投稿したメッセージを格納するトランザクションテーブル。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| username | TEXT | NULL | 投稿者のユーザー名（外部キー） |
| time | INTEGER | NULL | 投稿日時（UNIXタイムスタンプ） |
| msg | TEXT | NOT NULL | メッセージ本文（140文字以内） |

**制約:**
- FOREIGN KEY: username REFERENCES User(username)

**ビジネスルール:**
- メッセージは140文字以内に制限される（アプリケーション層で検証）

---

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

以下はSQLパーサーのテスト用スキーマであり、カラム名は匿名化されています。代表的なテーブルのみ記載します。

#### anon40（主要マスターテーブル）

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| anon41 | anon42 | NOT NULL | 主キー（自動生成、デフォルト: anon43()） |
| anon44 | TEXT | NOT NULL | ユニークテキスト1 |
| anon45 | TEXT | NOT NULL | ユニークテキスト2 |
| anon46 | TEXT | NOT NULL | テキスト1 |
| anon47 | TEXT | NOT NULL | テキスト2 |
| anon48 - anon61 | TEXT | NULL | オプションテキストフィールド |
| anon62 | VARCHAR(30) | NULL | オプション文字列1 |
| anon63 | VARCHAR(30) | NULL | オプション文字列2 |

**制約:**
- PRIMARY KEY: anon41
- UNIQUE: anon44
- UNIQUE: anon45

---

#### anon64（ユーザー/アカウントテーブル）

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| anon41 | SERIAL | NOT NULL | 主キー（自動採番） |
| anon65 | VARCHAR(30) | NOT NULL | ユニーク識別子 |
| anon46 | VARCHAR(30) | NOT NULL | 名前1 |
| anon66 | VARCHAR(30) | NOT NULL | 名前2 |
| anon47 | VARCHAR(30) | NOT NULL | 名前3 |
| anon67 | TEXT | NOT NULL | 説明/詳細 |
| anon55 | VARCHAR(30) | NOT NULL | ユニークコード |
| anon68 | VARCHAR(30) | NULL | タイプ（デフォルト: 'o'） |
| anon69 | BOOLEAN | NULL | 有効フラグ（デフォルト: true） |
| anon70 | INT | NOT NULL | 外部キー（anon40への参照） |

**制約:**
- PRIMARY KEY: anon41
- UNIQUE: anon65
- UNIQUE: anon55
- FOREIGN KEY: anon70 REFERENCES anon40(anon41)

---

#### anon154（伝票ヘッダーテーブル）

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| anon41 | SERIAL | NOT NULL | 主キー |
| anon155 | INT | NOT NULL | 伝票番号（ユニーク） |
| date | DATE | NOT NULL | 伝票日付（デフォルト: anon156） |
| anon157 | anon102 | NOT NULL | 取引先参照 |
| anon158 | anon102 | NOT NULL | 担当者参照 |
| anon159 - anon174 | DECIMAL | NOT NULL/NULL | 金額関連フィールド |
| anon175 | INT | NULL | 参照ID |
| anon169 | BOOLEAN | NULL | フラグ（デフォルト: false） |
| anon170 - anon172 | VARCHAR(30) | NOT NULL/NULL | ステータス/タイプ |
| anon176 - anon178 | VARCHAR(30) | NULL | オプションフィールド |
| anon70 | INT | NOT NULL | 外部キー（anon40への参照） |

**制約:**
- PRIMARY KEY: anon41
- UNIQUE: anon155
- FOREIGN KEY: anon70 REFERENCES anon40(anon41)
- FOREIGN KEY: anon157 REFERENCES anon140(anon41)
- FOREIGN KEY: anon158 REFERENCES anon64(anon41)

## 備考

### 使用データベース

- **Tweeterサンプル**: SQLite（`db_sqlite`モジュールを使用）
- **テスト用SQL**: PostgreSQL互換の構文（`parsesql`モジュールのテスト用）

### プロジェクトの性質

本プロジェクトはNim言語のコンパイラリポジトリであり、データベースは以下の目的で使用されています:

1. **サンプルアプリケーション**: 「Nim in Action」書籍のチャプター7で使用されるTwitterクローンのサンプル実装
2. **標準ライブラリテスト**: `parsesql`モジュール（SQLパーサー）の動作検証

### parsesqlモジュールについて

`lib/pure/parsesql.nim`はSQLファイルのパーサーを提供するモジュールです。PostgreSQL構文およびSQL ANSI標準をサポートしています。なお、このモジュールは非推奨（deprecated）となっており、代わりに`nimble install parsesql`でインストールして使用することが推奨されています。

### 注意事項

- テスト用SQLスキーマ（`somesql.sql`）は匿名化されたカラム名を使用しており、実際のアプリケーションのスキーマではありません
- Tweeterサンプルは学習目的のシンプルな実装であり、本番環境での使用は想定されていません
