データベーススキーマ
本システムはポリグロット永続化戦略を採用しており、PostgreSQL、Neo4j、Redisの3種類のデータストアを使用する。それぞれのデータストアの主要なスキーマとデータ構造を以下に記述する。
1. PostgreSQLスキーマ
PostgreSQLは、ユーザーアカウント、プロジェクトメタデータ、チャット履歴などのリレーショナルデータを管理する。
users テーブル
id(UUID, Primary Key): ユーザーの一意なIDusername(VARCHAR(255), Unique): ユーザー名email(VARCHAR(255), Unique): メールアドレスhashed_password(VARCHAR(255)): ハッシュ化されたパスワードcreated_at(TIMESTAMP): 作成日時updated_at(TIMESTAMP): 更新日時
projects テーブル
id(UUID, Primary Key): プロジェクトの一意なIDuser_id(UUID, Foreign Key tousers.id): プロジェクトオーナーのユーザーIDname(VARCHAR(255)): プロジェクト名description(TEXT): プロジェクトの説明current_graph_id(UUID, Nullable): 現在選択されているグラフのIDcreated_at(TIMESTAMP): 作成日時updated_at(TIMESTAMP): 更新日時
graphs テーブル
id(UUID, Primary Key): グラフデータの一意なIDproject_id(UUID, Foreign Key toprojects.id): 所属するプロジェクトのIDname(VARCHAR(255)): グラフデータの名称file_type(VARCHAR(50)): 元のファイル形式(例: CSV, JSON)uploaded_at(TIMESTAMP): アップロード日時
chat_history テーブル
id(UUID, Primary Key): チャット履歴の一意なIDproject_id(UUID, Foreign Key toprojects.id): 所属するプロジェクトのIDrole(VARCHAR(50)): メッセージの送信者(例: user, assistant)content(TEXT): メッセージ内容timestamp(TIMESTAMP): メッセージ送信日時
2. Neo4jデータ構造
Neo4jはグラフのトポロジー(ノード、エッジ、およびそれらのプロパティ)を管理する。
ノード (Nodes)
- ラベル:
Node - プロパティ:
id(String, Unique): ノードの一意な識別子(元のデータセットのID)project_id(String): 所属するプロジェクトのIDgraph_id(String): 所属するグラフのID- その他のユーザー定義プロパティ(例:
name,category,valueなど)
エッジ (Relationships)
- タイプ:
RELATES_TO,CONNECTS,HAS_INTERACTIONなど、グラフデータの意味に応じたタイプ - プロパティ:
project_id(String): 所属するプロジェクトのIDgraph_id(String): 所属するグラフのID- その他のユーザー定義プロパティ(例:
weight,typeなど)
3. Redisデータ構造
Redisは、高速キャッシュ、WebSocket接続状態管理、JWT失効リストなどに使用される。
1. 計算済みメトリクスとレイアウト座標
-
キーの命名規則:
project:{project_id}:graph:{graph_id}:metric:{metric_type}- 例:
project:uuid1:graph:uuid2:metric:degree_centrality
- 例:
-
データ型: Hash (
HSET)- フィールド: ノードID
- 値: 計算されたメトリクス値(例:
nodeA: 0.5, nodeB: 0.8)
-
キーの命名規則:
project:{project_id}:graph:{graph_id}:layout:{layout_type}- 例:
project:uuid1:graph:uuid2:layout:force_directed
- 例:
-
データ型: Hash (
HSET)- フィールド: ノードID
- 値: レイアウト座標(例:
nodeA: {x: 10, y: 20}, nodeB: {x: 30, y: 40})
2. WebSocket接続状態
-
キーの命名規則:
websocket:user:{user_id} -
データ型: Set (
SADD)- メンバー: 接続中のWebSocketセッションID(またはサーバーインスタンスIDとセッションIDの組み合わせ)
-
Pub/Subチャンネル:
channel:user_id:{user_id}- ユーザー固有のチャネルで状態変更をPublish/Subscribeする。
3. JWT失効リスト
- キーの命名規則:
jwt:blacklist:{jti} - データ型: String (
SET)- 値:
true(失効済みを示す) - TTL (Time To Live): リフレッシュトークンの有効期限に合わせる
- 値: