概要
Shannonは、永続的なストレージのためにPostgreSQLを使用しています。データベースは2つのスキーマに整理されています:auth- 認証、マルチテナンシー、およびセキュリティpublic- コアアプリケーションテーブル(タスク、エージェント、セッション)
拡張機能: uuid-ossp, pg_trgm, btree_gin, pgcrypto
エンティティリレーションシップ図
スキーマ: auth (認証とマルチテナンシー)
auth.tenants
目的: マルチテナントの組織管理
インデックス:
slugに対する主キー(UNIQUE)
auth.users
目的: ユーザー認証とプロフィール管理
インデックス:
idx_users_emailON (email)idx_users_tenant_idON (tenant_id)
auth.api_keys
目的: プログラムによるアクセスのためのAPIキー管理
インデックス:
idx_api_keys_tenant_idON (tenant_id)idx_api_keys_key_prefixON (key_prefix)
workflows:read: ワークフロー/タスクのステータスと結果の読み取りを許可workflows:write: ワークフロー/タスクの送信と管理を許可agents:execute: エージェント実行を許可
auth.refresh_tokens
目的: JWTリフレッシュトークンの保存と取り消し
インデックス:
idx_refresh_tokens_user_idON (user_id)idx_refresh_tokens_token_hashON (token_hash)
auth.audit_logs
目的: セキュリティイベントの監査トレイル
インデックス:
idx_audit_logs_user_idON (user_id)idx_audit_logs_tenant_idON (tenant_id)idx_audit_logs_event_typeON (event_type)idx_audit_logs_created_atON (created_at)
login- ユーザーログインlogout- ユーザーログアウトapi_key_created- APIキー生成permission_changed- ロール/権限の変更
スキーマ: public (コアアプリケーション)
users
目的: アプリケーションユーザープロファイル(レガシー、auth.usersにリンク)
インデックス:
idx_users_tenant_idON (tenant_id)idx_users_external_idON (external_id)
auth.usersを使用するべきです。
sessions
目的: ユーザーセッション管理とコンテキスト
インデックス:
idx_sessions_user_idON (user_id)idx_sessions_tenant_idON (tenant_id)idx_sessions_expires_atON (expires_at)idx_sessions_external_idON ((context->>‘external_id’)) WHERE context->>‘external_id’ IS NOT NULLidx_sessions_user_external_idUNIQUE ON (user_id, (context->>‘external_id’)) WHERE context->>‘external_id’ IS NOT NULL AND deleted_at IS NULLidx_sessions_not_deletedON (id) WHERE deleted_at IS NULLidx_sessions_deleted_atON (deleted_at) WHERE deleted_at IS NOT NULL
- 外部ID(非UUIDセッションID)は
context->>'external_id'に保存され、二重IDの検索を可能にします。 deleted_atカラムによるソフト削除のサポート -deleted_atがNULLでないセッションは削除されたと見なされます。
task_executions
目的: タスク/ワークフローの実行履歴とメトリクス
インデックス:
idx_task_user_sessionON (user_id, session_id)idx_task_created_atON (created_at DESC)idx_task_statusON (status)idx_task_workflow_idON (workflow_id)idx_task_executions_tenant_idON (tenant_id)idx_task_executions_session_idON (session_id)
RUNNING- タスク進行中COMPLETED- タスクが正常に完了FAILED- タスクがエラーで失敗CANCELLED- ユーザーによってタスクがキャンセル
agent_executions
目的: タスク内の個々のエージェント実行の詳細
インデックス:
idx_agent_executions_workflow_idON (workflow_id)idx_agent_executions_created_atON (created_at DESC)idx_agent_executions_stateON (state)
IDLE- エージェントアイドルANALYZING- 入力を分析中PLANNING- 実行を計画中RETRIEVING- 情報を取得中EXECUTING- タスクを実行中VALIDATING- 結果を検証中SYNTHESIZING- レスポンスを合成中COMPLETED- 実行完了FAILED- 実行失敗
tool_executions
目的: ツール呼び出し履歴とパフォーマンス
インデックス:
idx_tool_executions_workflow_idON (workflow_id)idx_tool_executions_tool_nameON (tool_name)idx_tool_executions_created_atON (created_at DESC)idx_tool_executions_successON (success)
event_logs
目的: 監査およびリプレイのためのイベントストレージ
インデックス:
idx_event_logs_workflow_idON (workflow_id)idx_event_logs_task_idON (task_id)idx_event_logs_typeON (type)idx_event_logs_tsON (timestamp DESC)idx_event_logs_seqON (workflow_id, seq)idx_event_logs_workflow_tsON (workflow_id, timestamp DESC)uq_event_logs_wf_type_seqUNIQUE ON (workflow_id, type, seq) WHERE seq IS NOT NULL
task.started- タスク実行開始task.completed- タスク実行完了agent.thinking- エージェント処理中tool.called- ツール呼び出し
token_usage
目的: タスクごとの詳細なトークン使用状況の追跡
インデックス:
idx_token_usage_user_idON (user_id)idx_token_usage_created_atON (created_at DESC)idx_token_usage_provider_modelON (provider, model)idx_token_usage_task_idON (task_id)
usage_daily_aggregates
目的: 事前計算された日次使用統計
インデックス:
idx_usage_daily_user_dateON (user_id, date)idx_usage_daily_dateON (date DESC)
追加テーブル
tool_calls
目的: レガシーツール呼び出しの追跡(代わりに tool_executions を使用)prompts
目的: プロンプトのバージョン管理とA/Bテストlearning_cases
目的: 強化学習ケースのストレージsession_archives
目的: Redisからの長期セッションスナップショットaudit_logs (public)
目的: アプリケーション監査トレイル(auth.audit_logsとは別)データベース関数
update_updated_at_column()
目的: 行の変更時にupdated_at を自動的に更新
使用法: users および sessions テーブルにトリガーとして添付
update_daily_aggregate(user_id, date)
目的: ユーザーのために日次使用集計を更新または作成 使用法: タスク完了時にトリガーを介して自動的に呼び出されるtrigger_update_daily_aggregate()
目的: タスクのステータス変更時に集計を更新するトリガー関数 使用法: task_executions の INSERT/UPDATE 時に自動的に発火サンプルクエリ
タスク分析
コスト分析
パフォーマンス監視
ベストプラクティス
1. インデックス作成
常にインデックスを使用するべき:- 外部キー列 (user_id, tenant_id, task_execution_id など)
- 頻繁にフィルタリングされる列 (status, created_at, expires_at)
- JSONB クエリ (context->>‘external_id’)
- 時間ベースのクエリ (created_at DESC)
2. パーティショニング
高ボリュームのテーブルにはパーティショニングを検討:3. データ保持
推奨ポリシー:event_logs: 90日 (高ボリューム、アーカイブ可能)task_executions: 1年 (古いデータをアーカイブ)audit_logs: 2年 (コンプライアンス)token_usage: 日次集計、90日後に生データをアーカイブ
4. クエリ最適化
EXPLAIN ANALYZE を使用:5. コネクションプーリング
設定 (Shannon ですでに設定済み):メンテナンス
Vacuum と Analyze
統計
関連ドキュメント
環境変数
データベース設定
パフォーマンス調整
クエリ最適化
監視
データベース監視