4. データベーススキーマ仕様
このドキュメントでは、LLMGraph-visアプリケーションで使用される主要なデータベーススキーマを定義します。
4.1. 設計方針の変更
ユーザーからのフィードバックに基づき、データモデルを単純化します。従来の「プロジェクト」という概念を廃止し、「1つの会話が1つのグラフを扱う」という、より直感的な1対1の関係を基本構造とします。
4.2. ER図
テーブル定義
| テーブル名 | 説明 |
|---|---|
users | アプリケーションのユーザー情報を格納します。 |
conversations | ユーザーが行う個々の分析セッション(会話)を管理します。各会話は必ず1つのグラフに紐付きます。 |
graphml_content | str |
messages | conversations に含まれる個々のメッセージ(ユーザーの発言、アシスタントの応答)を時系列で記録します。 |
calculation_results | NetworkX等で計算された中心性指標などの分析結果を永続化するためのキャッシュテーブルです。 |
visual_styles | グラフの最終的な視覚表現(ノードの座標、スタイル、エッジなど)をFrontendに送るデータ形式でキャッシュします。BackendがFrontendに返すレンダリングデータをそのまま保存します。 |
4.3. 計算結果キャッシュ (calculation_results)
NetworkX等で計算された中心性指標などの分析結果を永続化するためのテーブルです。高コストな計算の再実行を防ぐことを目的とします。このテーブルの仕様は変更ありません。
基本設計方針
- ハイブリッドモデル: 柔軟性とパフォーマンスを両立するため、メタデータをリレーショナルカラムで、変動しやすい計算結果を
JSONBカラムで管理するハイブリッドアプローチを採用します。 - データ型: 検索性能と柔軟性に優れた
JSONB型を計算結果の格納に使用します。 - インデックス:
JSONBカラムにはGINインデックスを作成し、高速な検索を可能にします。
推奨スキーマ
CREATE TABLE calculation_results (
id UUID PRIMARY KEY,
graph_id UUID NOT NULL, -- 外部キーとしてgraphsテーブルに関連付け
datatype TEXT NOT NULL, -- 'degree_centrality', 'pagerank', 'betweenness_centrality', 'closeness_centrality', 'eigenvector_centrality', 'load_centrality', 'edge_betweenness_centrality', 'clustering', 'transitivity', 'modularity' などの指標名
data JSONB NOT NULL, -- 計算結果の本体
created_at TIMESTAMPTZ DEFAULT NOW(),
UNIQUE(graph_id, datatype),
FOREIGN KEY (graph_id) REFERENCES graphs(id)
);
-- 高速な検索のためのGINインデックス
CREATE INDEX idx_gin_calculation_data ON calculation_results USING GIN (data);
data カラムのJSONB構造
計算結果は、分析クエリの効率を最大化するため、以下の「オブジェクトの配列」形式で格納します。
- キーの短縮: ストレージ効率のため、キーは
"n"(node) と"s"(score) に短縮します。 - 形式:
[{"n": "node_id", "s": score}, ...]
JSONBデータ格納例
degree_centrality の計算結果を格納する場合の例です。
[
{
"n": "node_1",
"s": 0.24
},
{
"n": "node_2",
"s": 0.16
},
{
"n": "node_3",
"s": 0.31
}
]
この構造により、スコア (s) に基づくフィルタリング、ソート、集計が効率的に行えます。
4.4. 視覚スタイル (visual_styles)
グラフの視覚的なスタイル設定(ノードサイズ、色など)を、適用された指標とマッピング設定と共に永続化するためのテーブルです。このテーブルは、最終的なレンダリングデータそのものではなく、BackendがFrontendに返すレンダリングデータを組み立てる際に使用する「マッピング設定」を保存します。
推奨スキーマ
CREATE TABLE visual_styles (
id UUID PRIMARY KEY,
graph_id UUID NOT NULL UNIQUE, -- 外部キーとしてgraphsテーブルに関連付け、1対1対応
nodes_data JSONB NOT NULL, -- Frontendに送るノードデータ(座標、スタイルなどを含む)
edges_data JSONB NOT NULL, -- Frontendに送るエッジデータ(スタイルなどを含む)
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW(),
FOREIGN KEY (graph_id) REFERENCES graphs(id)
);
-- nodes_dataとedges_data内の検索を高速化するためのGINインデックス(必要に応じて)
-- CREATE INDEX idx_gin_visual_styles_nodes_data ON visual_styles USING GIN (nodes_data);
-- CREATE INDEX idx_gin_visual_styles_edges_data ON visual_styles USING GIN (edges_data);