# データベース設計書

## 概要

本ドキュメントは、Doom Emacs プロジェクトにおけるデータ永続化メカニズムを記載したものです。

Doom Emacs は Emacs の設定フレームワークであり、従来のリレーショナルデータベース（MySQL、PostgreSQL 等）や NoSQL データベース（MongoDB、Redis 等）は使用していません。代わりに、Emacs Lisp のデータ構造をファイルにシリアライズする独自の永続化ストレージを実装しています。

本プロジェクトで使用されているデータストレージメカニズムは以下の2種類です：

1. **doom-store（キーバリューストア）**: ハッシュテーブルベースのファイル永続化ストレージ
2. **セッション管理**: persp-mode または desktop モードを使用したワークスペース/セッションの保存・復元

## テーブル一覧

本プロジェクトは従来のデータベーステーブルを使用していないため、「テーブル」の代わりに「データストア」として記載します。

| データストア名 | 対応エンティティ | 説明 |
| --- | --- | --- |
| doom-store | 永続化キャッシュ | キーバリュー形式でデータを保存するファイルベースストレージ |
| session-store | セッション情報 | Emacs のワークスペース・バッファ状態を保存 |

## 各データストア定義

### 1. doom-store（永続化キャッシュストア）

Doom Emacs 独自のキーバリューストレージシステムです。`lisp/lib/store.el` で実装されており、任意の Emacs Lisp オブジェクトを TTL（有効期限）付きでファイルに保存できます。

#### ストレージ構造

| フィールド名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| key | any (equal 比較可能) | No | エントリを識別するキー。`equal` で比較可能な任意の Lisp オブジェクト |
| ttl | integer / function / cons (time) / nil | Yes | 有効期限。nil の場合は無期限、整数の場合は秒数、cons の場合はタイムスタンプ |
| value | any | Yes | 保存する値。任意の Lisp オブジェクト |

#### ストレージ詳細

- **保存場所**: `doom-store-dir` 配下（デフォルト: `doom-profile-data-dir/store/`）
- **ファイル形式**: Emacs Lisp のシリアライズ形式（`prin1` による出力）
- **データ構造**: ハッシュテーブル（`equal` 比較）
- **永続化タイミング**:
  - `doom-store-put` 呼び出し時（`noflush` フラグがない場合）
  - Emacs 終了時（`kill-emacs-hook` 経由）

#### 主要 API

| 関数名 | 説明 |
| --- | --- |
| `doom-store-get` | キーに対応する値を取得 |
| `doom-store-put` | キーと値のペアを保存（TTL 指定可能） |
| `doom-store-rem` | キーを削除 |
| `doom-store-member-p` | キーの存在確認 |
| `doom-store-clear` | ストア全体をクリア |
| `doom-store-persist` | 変数を永続化対象として登録 |
| `doom-store-desist` | 変数の永続化登録を解除 |

### 2. session-store（セッション情報ストア）

Emacs のセッション状態（開いているバッファ、ウィンドウ配置、ワークスペース等）を保存・復元するためのストレージです。`lisp/lib/sessions.el` で実装されています。

#### ストレージ構造

セッションデータは外部パッケージ（persp-mode または desktop モード）の形式に依存します。

| フィールド名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| perspectives | list | Yes | persp-mode 使用時：ワークスペース（perspective）のリスト |
| buffers | list | Yes | 開いているバッファのリスト |
| frames | frameset | Yes | desktop モード使用時：フレーム状態 |
| windows | list | Yes | ウィンドウ配置情報 |

#### ストレージ詳細

- **保存場所**:
  - persp-mode: `persp-save-dir` 配下
  - desktop: `desktop-dirname` 配下
- **ファイル形式**: 各バックエンドの形式に依存
- **バックエンド**: persp-mode（優先）または desktop モード

#### 主要 API

| 関数名 | 説明 |
| --- | --- |
| `doom-session-file` | セッションファイルのパスを取得 |
| `doom-save-session` | 現在のセッションを保存 |
| `doom-load-session` | セッションを復元 |
| `doom/quicksave-session` | セッションをクイック保存（インタラクティブ） |
| `doom/quickload-session` | セッションをクイック復元（インタラクティブ） |

## 備考

### データベース非採用の理由

Doom Emacs は以下の理由から従来のデータベースを使用していません：

1. **軽量性**: Emacs は単一ユーザーのテキストエディタであり、複雑なデータベースは不要
2. **依存関係の最小化**: 外部データベースサーバーへの依存を避ける
3. **可搬性**: 設定ファイルと同様にデータをファイルとして管理することで、環境間の移行が容易
4. **Emacs との親和性**: Emacs Lisp のデータ構造をそのまま永続化できる

### データの整合性

- doom-store は TTL による自動期限切れ機能を持つ
- Emacs 終了時に `kill-emacs-hook` 経由で自動的に永続化される
- ファイルベースのため、トランザクションや同時実行制御は実装されていない

### 関連ファイル

- `lisp/lib/store.el`: doom-store の実装
- `lisp/lib/sessions.el`: セッション管理の実装
