Explorar o código

feat: 添加灵越智报2.0核心数据库表结构设计

- 图节点表(graph_nodes): 存储实体、文本、表格、图像等节点
- 图关系表(graph_relations): 存储节点间的关系和动作
- 规则表(rules): 存储用户定义的规则链
- 数据源表(data_sources): 管理数据源配置
- 模板表(templates): 支持模板复制和占位符映射
- 文本存储表(text_storage): 记录TXT文件路径
- 向量存储表(vector_embeddings): 支持RAG检索(需pgvector扩展)

设计特点:
- 支持图数据库结构的关系网络
- 支持规则引擎的单链表设计
- 支持模板替换模式
- 支持向量检索能力
- 完整的索引和触发器配置
何文松 hai 1 mes
pai
achega
fbdf7c1a3d
Modificáronse 1 ficheiros con 183 adicións e 0 borrados
  1. 183 0
      backend/sql/supplement_tables.sql

+ 183 - 0
backend/sql/supplement_tables.sql

@@ -0,0 +1,183 @@
+-- 灵越智报 v2.0 补充表结构
+-- PostgreSQL 15+
+-- 根据产品设计方案补充的表结构
+
+-- ============================================
+-- 1. 图节点表(graph_nodes)
+-- ============================================
+CREATE TABLE IF NOT EXISTS graph_nodes (
+    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
+    document_id UUID NOT NULL REFERENCES documents(id) ON DELETE CASCADE,
+    user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
+    name VARCHAR(255) NOT NULL,
+    type VARCHAR(50) NOT NULL, -- text/table/image/number/date/company/person等
+    value TEXT,
+    position JSONB, -- {file_id, page, line, char_start, char_end}
+    parent_id UUID REFERENCES graph_nodes(id) ON DELETE SET NULL,
+    level INTEGER DEFAULT 0, -- 层级
+    metadata JSONB DEFAULT '{}',
+    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
+);
+
+CREATE INDEX IF NOT EXISTS idx_graph_nodes_document_id ON graph_nodes(document_id);
+CREATE INDEX IF NOT EXISTS idx_graph_nodes_user_id ON graph_nodes(user_id);
+CREATE INDEX IF NOT EXISTS idx_graph_nodes_type ON graph_nodes(type);
+CREATE INDEX IF NOT EXISTS idx_graph_nodes_parent_id ON graph_nodes(parent_id);
+CREATE INDEX IF NOT EXISTS idx_graph_nodes_position ON graph_nodes USING GIN(position);
+
+-- ============================================
+-- 2. 图关系表(graph_relations)
+-- ============================================
+CREATE TABLE IF NOT EXISTS graph_relations (
+    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
+    from_node_id UUID NOT NULL REFERENCES graph_nodes(id) ON DELETE CASCADE,
+    to_node_id UUID NOT NULL REFERENCES graph_nodes(id) ON DELETE CASCADE,
+    relation_type VARCHAR(50) NOT NULL, -- DEP/ADD/SUB/MUL/DIV/UNION/INTERSECT/AI等
+    action_type VARCHAR(50), -- 动作类型
+    action_config JSONB, -- 动作配置(如AI模型ID)
+    order_index INTEGER DEFAULT 0, -- 顺序
+    condition_expr TEXT, -- 条件表达式
+    metadata JSONB DEFAULT '{}',
+    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
+);
+
+CREATE INDEX IF NOT EXISTS idx_graph_relations_from_node ON graph_relations(from_node_id);
+CREATE INDEX IF NOT EXISTS idx_graph_relations_to_node ON graph_relations(to_node_id);
+CREATE INDEX IF NOT EXISTS idx_graph_relations_type ON graph_relations(relation_type);
+
+-- ============================================
+-- 3. 规则表(rules)
+-- ============================================
+CREATE TABLE IF NOT EXISTS rules (
+    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
+    user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
+    name VARCHAR(255) NOT NULL,
+    description TEXT,
+    entry_node_id UUID NOT NULL REFERENCES graph_nodes(id) ON DELETE CASCADE,
+    exit_node_id UUID NOT NULL REFERENCES graph_nodes(id) ON DELETE CASCADE,
+    rule_chain JSONB NOT NULL DEFAULT '[]', -- 规则链(节点ID序列)
+    status VARCHAR(20) DEFAULT 'active', -- active/inactive
+    metadata JSONB DEFAULT '{}',
+    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
+);
+
+CREATE INDEX IF NOT EXISTS idx_rules_user_id ON rules(user_id);
+CREATE INDEX IF NOT EXISTS idx_rules_entry_node ON rules(entry_node_id);
+CREATE INDEX IF NOT EXISTS idx_rules_exit_node ON rules(exit_node_id);
+CREATE INDEX IF NOT EXISTS idx_rules_status ON rules(status);
+
+-- ============================================
+-- 4. 数据源表(data_sources)
+-- ============================================
+CREATE TABLE IF NOT EXISTS data_sources (
+    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
+    user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
+    document_id UUID REFERENCES documents(id) ON DELETE SET NULL,
+    name VARCHAR(255) NOT NULL,
+    type VARCHAR(50) NOT NULL, -- table/text/image
+    source_type VARCHAR(50) NOT NULL, -- file/manual/rule_result
+    node_ids UUID[] DEFAULT '{}', -- 关联的节点ID数组
+    config JSONB DEFAULT '{}', -- 数据源配置
+    metadata JSONB DEFAULT '{}',
+    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
+);
+
+CREATE INDEX IF NOT EXISTS idx_data_sources_user_id ON data_sources(user_id);
+CREATE INDEX IF NOT EXISTS idx_data_sources_document_id ON data_sources(document_id);
+CREATE INDEX IF NOT EXISTS idx_data_sources_type ON data_sources(type);
+
+-- ============================================
+-- 5. 模板表(templates)
+-- ============================================
+CREATE TABLE IF NOT EXISTS templates (
+    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
+    user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
+    name VARCHAR(255) NOT NULL,
+    content TEXT NOT NULL, -- 模板内容(带占位符)
+    placeholder_mapping JSONB DEFAULT '{}', -- 占位符到数据源的映射
+    source_template_id UUID REFERENCES templates(id) ON DELETE SET NULL, -- 复制来源
+    status VARCHAR(20) DEFAULT 'active', -- active/inactive
+    metadata JSONB DEFAULT '{}',
+    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
+);
+
+CREATE INDEX IF NOT EXISTS idx_templates_user_id ON templates(user_id);
+CREATE INDEX IF NOT EXISTS idx_templates_source_template ON templates(source_template_id);
+CREATE INDEX IF NOT EXISTS idx_templates_status ON templates(status);
+
+-- ============================================
+-- 6. 文本存储路径表(text_storage)
+-- ============================================
+CREATE TABLE IF NOT EXISTS text_storage (
+    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
+    document_id UUID NOT NULL REFERENCES documents(id) ON DELETE CASCADE,
+    file_path VARCHAR(500) NOT NULL, -- TXT文件路径
+    file_size BIGINT,
+    checksum VARCHAR(64), -- 文件校验和
+    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
+);
+
+CREATE INDEX IF NOT EXISTS idx_text_storage_document_id ON text_storage(document_id);
+CREATE UNIQUE INDEX IF NOT EXISTS idx_text_storage_document_unique ON text_storage(document_id);
+
+-- ============================================
+-- 7. 向量存储表(vector_embeddings)
+-- ============================================
+-- 注意:需要先安装pgvector扩展
+-- CREATE EXTENSION IF NOT EXISTS vector;
+
+CREATE TABLE IF NOT EXISTS vector_embeddings (
+    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
+    document_id UUID NOT NULL REFERENCES documents(id) ON DELETE CASCADE,
+    chunk_text TEXT NOT NULL,
+    chunk_index INTEGER NOT NULL, -- 分块索引
+    embedding vector(768), -- 向量(需要pgvector扩展,如果未安装可先注释)
+    file_name VARCHAR(255),
+    file_hash VARCHAR(64), -- MD5哈希
+    metadata JSONB DEFAULT '{}',
+    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
+);
+
+CREATE INDEX IF NOT EXISTS idx_vector_embeddings_document_id ON vector_embeddings(document_id);
+CREATE INDEX IF NOT EXISTS idx_vector_embeddings_file_hash ON vector_embeddings(file_hash);
+-- 向量相似度搜索索引(需要pgvector扩展)
+-- CREATE INDEX IF NOT EXISTS idx_vector_embeddings_embedding ON vector_embeddings USING ivfflat (embedding vector_cosine_ops);
+
+-- ============================================
+-- 创建更新时间触发器
+-- ============================================
+CREATE TRIGGER update_graph_nodes_updated_at BEFORE UPDATE ON graph_nodes
+    FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
+
+CREATE TRIGGER update_graph_relations_updated_at BEFORE UPDATE ON graph_relations
+    FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
+
+CREATE TRIGGER update_rules_updated_at BEFORE UPDATE ON rules
+    FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
+
+CREATE TRIGGER update_data_sources_updated_at BEFORE UPDATE ON data_sources
+    FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
+
+CREATE TRIGGER update_templates_updated_at BEFORE UPDATE ON templates
+    FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
+
+CREATE TRIGGER update_text_storage_updated_at BEFORE UPDATE ON text_storage
+    FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
+
+-- ============================================
+-- 安装pgvector扩展(可选,用于向量检索)
+-- ============================================
+-- 如果需要使用pgvector,请执行:
+-- CREATE EXTENSION IF NOT EXISTS vector;
+-- 
+-- 安装方法:
+-- 1. 下载pgvector: https://github.com/pgvector/pgvector
+-- 2. 编译安装
+-- 3. 在数据库中执行: CREATE EXTENSION vector;
+