メインコンテンツまでスキップ
バージョン: Next

4. データベーススキーマ仕様

前提知識レベル:

  • リレーショナルデータベースおよびSQLに関する基本的な知識
  • ER図の読解能力

このドキュメントでは、GraphVisAgentアプリケーションで使用される主要なデータベーススキーマを定義します。

4.1. 設計方針​

本データベースは、以下の設計方針に基づき、データの永続化を行います。

  1. ユーザーとチャット、ネットワークの関係: ユーザーは複数のチャットを持つことができます。各チャットセッションは、単一のネットワークに1対1で対応します。

  2. ノードとエッジの明示的な管理: ネットワークを構成するノードとエッジを明示的に管理します。

  3. 属性の永続化と型別分離: ネットワークの属性(計算結果や元データ由来)は永続的なデータとして扱います。データ型別・要素別に分離したテーブル構造(サブタイプモデル)を採用し、型安全性を確保します。

  4. 属性メタデータの充実化: 属性には詳細な説明を付与し、LLMの属性選択精度を向上させます。

  5. 複数データベースのサポート: SQLAlchemy ORMを使用することで、PostgreSQLとMySQLの両方に対応可能なデータベース設計とします。具体的なDDLは、SQLAlchemyのマイグレーションツール(例: Alembic)によって各データベースに最適化された形で生成されます。

4.2. ER図​

テーブル定義​

(テーブル定義のリストはER図とSQLから自明なため省略)

4.3. 基本テーブル​

補足: 以下のテーブル定義は概念的なものであり、SQLAlchemy ORMを通じて定義されます。idカラムの自動採番(AUTOINCREMENT相当)は、SQLAlchemyが各データベースの適切な機能(PostgreSQLのSERIALやIDENTITY、MySQLのAUTO_INCREMENTなど)を利用して管理します。

4.3.1. users​

CREATE TABLE users (
id INTEGER PRIMARY KEY,
username VARCHAR(255) NOT NULL UNIQUE,
hashed_password VARCHAR(255) NOT NULL,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);

4.3.2. networks​

CREATE TABLE networks (
id INTEGER PRIMARY KEY,
name VARCHAR(255) NOT NULL,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);

4.3.3. chats​

    id INTEGER PRIMARY KEY,
name VARCHAR(255) NOT NULL,
user_id INTEGER NOT NULL,
network_id INTEGER NOT NULL UNIQUE,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW(),
FOREIGN KEY (user_id) REFERENCES users(id),
FOREIGN KEY (network_id) REFERENCES networks(id)
);

4.3.4. chat_messages​

CREATE TABLE chat_messages (
id INTEGER PRIMARY KEY,
chat_id INTEGER NOT NULL,
role VARCHAR(50) NOT NULL,
content TEXT NOT NULL,
meta_data JSON,
created_at TIMESTAMPTZ DEFAULT NOW(),
FOREIGN KEY (chat_id) REFERENCES chats(id)
);

4.3.5. nodes​

CREATE TABLE nodes (
id INTEGER PRIMARY KEY,
network_id INTEGER NOT NULL,
node_id VARCHAR(255) NOT NULL,
label VARCHAR(255),
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW(),
FOREIGN KEY (network_id) REFERENCES networks(id),
UNIQUE(network_id, node_id)
);

4.3.6. edges​

CREATE TABLE edges (
id INTEGER PRIMARY KEY,
network_id INTEGER NOT NULL,
edge_id VARCHAR(255) NOT NULL,
source_node_id INTEGER NOT NULL,
target_node_id INTEGER NOT NULL,
weight FLOAT DEFAULT 1.0,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW(),
FOREIGN KEY (network_id) REFERENCES networks(id),
FOREIGN KEY (source_node_id) REFERENCES nodes(id),
FOREIGN KEY (target_node_id) REFERENCES nodes(id),
UNIQUE(network_id, edge_id)
);

4.4. 属性テーブル(サブタイプ階層)​

node_attributes (基底)​

CREATE TABLE node_attributes (
id INTEGER PRIMARY KEY,
network_id INTEGER NOT NULL,
attribute_name VARCHAR(255) NOT NULL,
description TEXT,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW(),
FOREIGN KEY (network_id) REFERENCES networks(id),
UNIQUE(network_id, attribute_name)
);
CREATE TABLE node_text_attributes (
node_attribute_id INTEGER PRIMARY KEY,
FOREIGN KEY (node_attribute_id) REFERENCES node_attributes(id)
);
CREATE TABLE node_float_attributes (
node_attribute_id INTEGER PRIMARY KEY,
FOREIGN KEY (node_attribute_id) REFERENCES node_attributes(id)
);

edge_attributes (基底)​

    id INTEGER PRIMARY KEY,
network_id INTEGER NOT NULL,
attribute_name VARCHAR(255) NOT NULL,
description TEXT,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW(),
FOREIGN KEY (network_id) REFERENCES networks(id),
UNIQUE(network_id, attribute_name)
);
CREATE TABLE edge_text_attributes (
edge_attribute_id INTEGER PRIMARY KEY,
FOREIGN KEY (edge_attribute_id) REFERENCES edge_attributes(id)
);
CREATE TABLE edge_float_attributes (
edge_attribute_id INTEGER PRIMARY KEY,
FOREIGN KEY (edge_attribute_id) REFERENCES edge_attributes(id)
);

4.5. 属性値テーブル(サブタイプ階層)​

node_attribute_values (基底)​

CREATE TABLE node_attribute_values (
id INTEGER PRIMARY KEY,
node_id INTEGER NOT NULL,
attribute_id INTEGER NOT NULL,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW(),
FOREIGN KEY (node_id) REFERENCES nodes(id),
FOREIGN KEY (attribute_id) REFERENCES node_attributes(id),
UNIQUE(node_id, attribute_id)
);
CREATE TABLE node_text_attribute_values (
node_attribute_value_id INTEGER PRIMARY KEY,
text_value TEXT,
FOREIGN KEY (node_attribute_value_id) REFERENCES node_attribute_values(id)
);
CREATE TABLE node_float_attribute_values (
node_attribute_value_id INTEGER PRIMARY KEY,
float_value FLOAT,
FOREIGN KEY (node_attribute_value_id) REFERENCES node_attribute_values(id)
);

edge_attribute_values (基底)​

CREATE TABLE edge_attribute_values (
id INTEGER PRIMARY KEY,
edge_id INTEGER NOT NULL,
attribute_id INTEGER NOT NULL,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW(),
FOREIGN KEY (edge_id) REFERENCES edges(id),
FOREIGN KEY (attribute_id) REFERENCES edge_attributes(id),
UNIQUE(edge_id, attribute_id)
);
CREATE TABLE edge_text_attribute_values (
edge_attribute_value_id INTEGER PRIMARY KEY,
text_value TEXT,
FOREIGN KEY (edge_attribute_value_id) REFERENCES edge_attribute_values(id)
);
CREATE TABLE edge_float_attribute_values (
edge_attribute_value_id INTEGER PRIMARY KEY,
float_value FLOAT,
FOREIGN KEY (edge_attribute_value_id) REFERENCES edge_attribute_values(id)
);