-- ===================================================================== -- 知识库(module/knowledge):用户隔离 + 内置标记 -- -- 幂等脚本(可重复执行)。项目无 Flyway,按 sql/ 目录既有约定手工执行。 -- -- 两层隔离模型: -- 知识库本体 is_builtin=1 内置库全局可见可绑定(仅管理员 userId=1 可维护); -- is_builtin=0 自建库仅创建者可见(user_id 过滤)。 -- 库内文档 列表/下载/删除/重试只对上传者本人开放(knowledge_doc.user_id 过滤); -- 内置库里管理员上传的文档清单对普通用户不可见。 -- RAG 检索 search_knowledge 检索绑定知识库的全量文档(与文档列表隔离解耦)。 -- -- 向量表:pgvector 动态建表 kb_vec_{kbId}{tag}_d{dims} -- (tag 为嵌入模型标签,本地/在线模型物理隔离),仿 chat_att_vec_{caseId}_d{dims}。 -- ===================================================================== -- 知识库 create table if not exists knowledge_base ( id bigint primary key, -- 雪花ID;内置库固定 id=1 user_id bigint not null, -- 创建者(内置库=1 平台管理员) is_builtin smallint not null default 0, -- 1=内置(全局可见只读),0=用户自建 name varchar(100) not null, description varchar(500), create_time timestamp default current_timestamp, update_time timestamp ); create index if not exists idx_kb_user on knowledge_base (user_id); -- 知识库文档(元数据 + 解析/索引状态;user_id 即上传者,列表/下载隔离依据) create table if not exists knowledge_doc ( id bigint primary key, kb_id bigint not null, user_id bigint not null, -- 上传者(列表/下载隔离依据) file_name varchar(500) not null, file_path varchar(1000) not null, -- 原件存储相对路径(下载用) sidecar_path varchar(1000), -- Tika 全文 .txt 存储相对路径(向量化用) mime varchar(100), size_bytes bigint default 0, char_count integer default 0, -- 提取文本字符数 chunk_count integer default 0, -- 已向量化块数 index_status varchar(20) default 'PENDING', -- PENDING / INDEXING / READY / FAILED fail_reason varchar(1000), download_count integer default 0, -- 下载次数(我的文档列表展示) create_time timestamp default current_timestamp, update_time timestamp ); create index if not exists idx_kd_kb_user on knowledge_doc (kb_id, user_id); -- 下载记录(谁在何时下载了哪个文档) create table if not exists knowledge_doc_download_log ( id bigint primary key, -- 雪花ID kb_id bigint not null, doc_id bigint not null, user_id bigint not null, -- 下载人 file_name varchar(500) not null, -- 下载时文件名快照 download_time timestamp default current_timestamp ); create index if not exists idx_kdl_doc on knowledge_doc_download_log (doc_id); create index if not exists idx_kdl_user on knowledge_doc_download_log (user_id); -- 内置知识库(文档由管理员在界面上传) insert into knowledge_base (id, user_id, is_builtin, name, description) values (1, 1, 1, '系统通用知识库', '系统内置知识库,所有用户可见可绑定(仅管理员可维护文档)') on conflict (id) do nothing; -- agent(研判方案)绑定知识库:一个方案最多绑定一个,可空 ALTER TABLE agent ADD COLUMN IF NOT EXISTS knowledge_base_id BIGINT;