Skip to main content

概要

Shannonは、永続的なストレージのためにPostgreSQLを使用しています。データベースは2つのスキーマに整理されています:
  • auth - 認証、マルチテナンシー、およびセキュリティ
  • public - コアアプリケーションテーブル(タスク、エージェント、セッション)
テーブル数: 25テーブル
拡張機能: uuid-ossp, pg_trgm, btree_gin, pgcrypto

エンティティリレーションシップ図

スキーマ: auth (認証とマルチテナンシー)

auth.tenants

目的: マルチテナントの組織管理 インデックス:
  • slugに対する主キー(UNIQUE)
:

auth.users

目的: ユーザー認証とプロフィール管理 インデックス:
  • idx_users_email ON (email)
  • idx_users_tenant_id ON (tenant_id)
:

auth.api_keys

目的: プログラムによるアクセスのためのAPIキー管理 インデックス:
  • idx_api_keys_tenant_id ON (tenant_id)
  • idx_api_keys_key_prefix ON (key_prefix)
デフォルトスコープ:
  • workflows:read: ワークフロー/タスクのステータスと結果の読み取りを許可
  • workflows:write: ワークフロー/タスクの送信と管理を許可
  • agents:execute: エージェント実行を許可
:

auth.refresh_tokens

目的: JWTリフレッシュトークンの保存と取り消し インデックス:
  • idx_refresh_tokens_user_id ON (user_id)
  • idx_refresh_tokens_token_hash ON (token_hash)
:

auth.audit_logs

目的: セキュリティイベントの監査トレイル インデックス:
  • idx_audit_logs_user_id ON (user_id)
  • idx_audit_logs_tenant_id ON (tenant_id)
  • idx_audit_logs_event_type ON (event_type)
  • idx_audit_logs_created_at ON (created_at)
イベントタイプ:
  • login - ユーザーログイン
  • logout - ユーザーログアウト
  • api_key_created - APIキー生成
  • permission_changed - ロール/権限の変更
:

スキーマ: public (コアアプリケーション)

users

目的: アプリケーションユーザープロファイル(レガシー、auth.usersにリンク) インデックス:
  • idx_users_tenant_id ON (tenant_id)
  • idx_users_external_id ON (external_id)
注意: このテーブルは後方互換性のために存在します。新しいコードはauth.usersを使用するべきです。

sessions

目的: ユーザーセッション管理とコンテキスト インデックス:
  • idx_sessions_user_id ON (user_id)
  • idx_sessions_tenant_id ON (tenant_id)
  • idx_sessions_expires_at ON (expires_at)
  • idx_sessions_external_id ON ((context->>‘external_id’)) WHERE context->>‘external_id’ IS NOT NULL
  • idx_sessions_user_external_id UNIQUE ON (user_id, (context->>‘external_id’)) WHERE context->>‘external_id’ IS NOT NULL AND deleted_at IS NULL
  • idx_sessions_not_deleted ON (id) WHERE deleted_at IS NULL
  • idx_sessions_deleted_at ON (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_session ON (user_id, session_id)
  • idx_task_created_at ON (created_at DESC)
  • idx_task_status ON (status)
  • idx_task_workflow_id ON (workflow_id)
  • idx_task_executions_tenant_id ON (tenant_id)
  • idx_task_executions_session_id ON (session_id)
ステータス値:
  • RUNNING - タスク進行中
  • COMPLETED - タスクが正常に完了
  • FAILED - タスクがエラーで失敗
  • CANCELLED - ユーザーによってタスクがキャンセル
:

agent_executions

目的: タスク内の個々のエージェント実行の詳細 インデックス:
  • idx_agent_executions_workflow_id ON (workflow_id)
  • idx_agent_executions_created_at ON (created_at DESC)
  • idx_agent_executions_state ON (state)
ステート値:
  • IDLE - エージェントアイドル
  • ANALYZING - 入力を分析中
  • PLANNING - 実行を計画中
  • RETRIEVING - 情報を取得中
  • EXECUTING - タスクを実行中
  • VALIDATING - 結果を検証中
  • SYNTHESIZING - レスポンスを合成中
  • COMPLETED - 実行完了
  • FAILED - 実行失敗
:

tool_executions

目的: ツール呼び出し履歴とパフォーマンス インデックス:
  • idx_tool_executions_workflow_id ON (workflow_id)
  • idx_tool_executions_tool_name ON (tool_name)
  • idx_tool_executions_created_at ON (created_at DESC)
  • idx_tool_executions_success ON (success)
:

event_logs

目的: 監査およびリプレイのためのイベントストレージ インデックス:
  • idx_event_logs_workflow_id ON (workflow_id)
  • idx_event_logs_task_id ON (task_id)
  • idx_event_logs_type ON (type)
  • idx_event_logs_ts ON (timestamp DESC)
  • idx_event_logs_seq ON (workflow_id, seq)
  • idx_event_logs_workflow_ts ON (workflow_id, timestamp DESC)
  • uq_event_logs_wf_type_seq UNIQUE ON (workflow_id, type, seq) WHERE seq IS NOT NULL
イベントタイプ:
  • task.started - タスク実行開始
  • task.completed - タスク実行完了
  • agent.thinking - エージェント処理中
  • tool.called - ツール呼び出し
:

token_usage

目的: タスクごとの詳細なトークン使用状況の追跡 インデックス:
  • idx_token_usage_user_id ON (user_id)
  • idx_token_usage_created_at ON (created_at DESC)
  • idx_token_usage_provider_model ON (provider, model)
  • idx_token_usage_task_id ON (task_id)
:

usage_daily_aggregates

目的: 事前計算された日次使用統計 インデックス:
  • idx_usage_daily_user_date ON (user_id, date)
  • idx_usage_daily_date ON (date DESC)
ユニーク制約: (user_id, date) :

追加テーブル

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

統計

関連ドキュメント

環境変数

データベース設定

パフォーマンス調整

クエリ最適化

監視

データベース監視