huoyan-enterprise/sql.txt

676 lines
24 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

create table public.chat_messages
(
id serial
primary key,
thread_id varchar(255) not null,
checkpoint_id varchar(255) not null,
message_index integer not null,
role varchar(20) not null,
content text not null,
injected_content text,
has_files boolean default false,
metadata jsonb,
created_at timestamp with time zone default CURRENT_TIMESTAMP,
name varchar(255),
constraint uk_checkpoint_message
unique (checkpoint_id, message_index)
);
comment on table public.chat_messages is '聊天消息表存储用户原始消息和AI响应的关键信息';
comment on column public.chat_messages.thread_id is '会话线程ID';
comment on column public.chat_messages.checkpoint_id is '关联的checkpoint ID';
comment on column public.chat_messages.message_index is '消息在checkpoint中的索引从0开始';
comment on column public.chat_messages.role is '消息角色user、assistant、system、tool';
comment on column public.chat_messages.content is '用户的原始问题或AI的响应';
comment on column public.chat_messages.injected_content is '注入给AI的完整内容包含文件内容';
comment on column public.chat_messages.has_files is '是否关联了文件';
comment on column public.chat_messages.metadata is '额外信息token、模型、推理内容等';
comment on column public.chat_messages.name is '工具消息时的工具名称(如 internet_search、text_to_image';
alter table public.chat_messages
owner to zuoleiroot;
create index idx_chat_messages_thread_id
on public.chat_messages (thread_id);
create index idx_chat_messages_checkpoint_id
on public.chat_messages (checkpoint_id);
create index idx_chat_messages_thread_created
on public.chat_messages (thread_id asc, created_at desc);
create index idx_chat_messages_role
on public.chat_messages (role);
create index idx_chat_messages_has_files
on public.chat_messages (has_files);
create index idx_chat_messages_metadata
on public.chat_messages using gin (metadata);
create index idx_chat_messages_content_search
on public.chat_messages using gin (to_tsvector('simple'::regconfig, content));
create table public.checkpoint_migrations
(
v integer not null
primary key
);
alter table public.checkpoint_migrations
owner to zuoleiroot;
create table public.checkpoints
(
thread_id text not null,
checkpoint_ns text default ''::text not null,
checkpoint_id text not null,
parent_checkpoint_id text,
type text,
checkpoint jsonb not null,
metadata jsonb default '{}'::jsonb not null,
primary key (thread_id, checkpoint_ns, checkpoint_id)
);
alter table public.checkpoints
owner to zuoleiroot;
create index checkpoints_thread_id_idx
on public.checkpoints (thread_id);
create table public.checkpoint_blobs
(
thread_id text not null,
checkpoint_ns text default ''::text not null,
channel text not null,
version text not null,
type text not null,
blob bytea,
primary key (thread_id, checkpoint_ns, channel, version)
);
alter table public.checkpoint_blobs
owner to zuoleiroot;
create index checkpoint_blobs_thread_id_idx
on public.checkpoint_blobs (thread_id);
create table public.checkpoint_writes
(
thread_id text not null,
checkpoint_ns text default ''::text not null,
checkpoint_id text not null,
task_id text not null,
idx integer not null,
channel text not null,
type text,
blob bytea not null,
task_path text default ''::text not null,
primary key (thread_id, checkpoint_ns, checkpoint_id, task_id, idx)
);
alter table public.checkpoint_writes
owner to zuoleiroot;
create index checkpoint_writes_thread_id_idx
on public.checkpoint_writes (thread_id);
create table public.enterprise
(
id serial
primary key,
name varchar(255) not null,
code varchar(64)
unique,
created_at timestamp with time zone default CURRENT_TIMESTAMP not null,
updated_at timestamp with time zone default CURRENT_TIMESTAMP not null
);
comment on table public.enterprise is '企业(单租户部署通常仅一条记录)';
alter table public.enterprise
owner to zuoleiroot;
create table public.department
(
id serial
primary key,
enterprise_id integer not null
references public.enterprise
on delete cascade,
name varchar(255) not null,
parent_id integer
references public.department
on delete set null,
created_at timestamp with time zone default CURRENT_TIMESTAMP not null,
updated_at timestamp with time zone default CURRENT_TIMESTAMP not null,
constraint uq_department_enterprise_name
unique (enterprise_id, name)
);
comment on table public.department is '部门';
alter table public.department
owner to zuoleiroot;
create table public.user_list
(
id serial
primary key,
username varchar(50) not null
unique,
email varchar(255) not null
constraint unique_email
unique,
phone varchar(255) not null
unique,
github_id varchar(100)
constraint unique_github_id
unique,
github_username varchar(100),
github_avatar_url text,
github_access_token text,
github_token_expires_at timestamp with time zone,
display_name varchar(100),
avatar_url text,
bio text,
is_active boolean default true,
email_verified boolean default false,
created_at timestamp with time zone default CURRENT_TIMESTAMP,
updated_at timestamp with time zone default CURRENT_TIMESTAMP,
last_login_at timestamp with time zone,
hashed_password varchar(255),
is_search boolean default false,
is_reasoner boolean default false,
enterprise_id integer default 1 not null
references public.enterprise,
department_id integer
references public.department
on delete set null,
role varchar(32) default 'employee'::character varying not null,
is_first_login boolean default true not null
);
comment on column public.user_list.role is 'admin | leader | employee';
comment on column public.user_list.is_first_login is '首次登录可强制改密(可选业务)';
alter table public.user_list
owner to zuoleiroot;
create index idx_user_list_github_id
on public.user_list (github_id);
create index idx_user_list_email
on public.user_list (email);
create index idx_user_list_username
on public.user_list (username);
create index idx_user_list_created_at
on public.user_list (created_at);
create index idx_user_list_enterprise_id
on public.user_list (enterprise_id);
create index idx_user_list_department_id
on public.user_list (department_id);
create index idx_user_list_role
on public.user_list (role);
create table public.knowledge_base
(
id serial
primary key,
user_id integer not null,
name varchar(255) not null,
description text,
created_at timestamp with time zone default CURRENT_TIMESTAMP,
updated_at timestamp with time zone default CURRENT_TIMESTAMP,
is_deleted boolean default false,
deleted_at timestamp with time zone,
enterprise_id integer default 1 not null
references public.enterprise,
department_id integer
references public.department
on delete set null,
creator_id integer not null
references public.user_list
on delete set null,
visibility varchar(32) default 'private'::character varying not null
constraint ck_knowledge_base_visibility
check ((visibility)::text = ANY
((ARRAY ['private'::character varying, 'department'::character varying, 'enterprise'::character varying])::text[]))
);
comment on column public.knowledge_base.creator_id is '创建者(与 user_id 通常一致,用于权限判断)';
comment on column public.knowledge_base.visibility is 'private | department | enterprise';
alter table public.knowledge_base
owner to zuoleiroot;
create index idx_knowledge_base_user_id
on public.knowledge_base (user_id);
create index idx_knowledge_base_user_name
on public.knowledge_base (user_id, name);
create index idx_knowledge_base_created_at
on public.knowledge_base (created_at);
create index idx_knowledge_base_is_deleted
on public.knowledge_base (is_deleted);
create index idx_knowledge_base_user_deleted
on public.knowledge_base (user_id, is_deleted);
create unique index uk_user_knowledge_base_name_active
on public.knowledge_base (user_id, name)
where (is_deleted = false);
create index idx_knowledge_base_enterprise
on public.knowledge_base (enterprise_id);
create index idx_knowledge_base_creator
on public.knowledge_base (creator_id);
create index idx_knowledge_base_ent_vis
on public.knowledge_base (enterprise_id, visibility)
where (is_deleted = false);
create table public.knowledge_base_file
(
id serial
primary key,
knowledge_base_id integer not null
constraint fk_knowledge_base
references public.knowledge_base
on delete cascade,
user_id integer not null,
file_name varchar(255) not null,
file_path varchar(500) not null,
file_size bigint not null,
file_type varchar(50) default 'pdf'::character varying not null,
status varchar(20) default 'processing'::character varying not null,
chunk_count integer default 0,
created_at timestamp with time zone default CURRENT_TIMESTAMP,
updated_at timestamp with time zone default CURRENT_TIMESTAMP,
is_deleted boolean default false,
deleted_at timestamp with time zone
);
alter table public.knowledge_base_file
owner to zuoleiroot;
create index idx_kb_file_kb_id
on public.knowledge_base_file (knowledge_base_id);
create index idx_kb_file_user_id
on public.knowledge_base_file (user_id);
create index idx_kb_file_status
on public.knowledge_base_file (status);
create index idx_kb_file_created_at
on public.knowledge_base_file (created_at);
create unique index idx_kb_file_unique_active
on public.knowledge_base_file (knowledge_base_id, file_name)
where (is_deleted = false);
create table public.knowledge_base_chunk
(
id serial
primary key,
file_id integer not null
constraint fk_kb_file
references public.knowledge_base_file
on delete cascade,
knowledge_base_id integer not null
constraint fk_kb
references public.knowledge_base
on delete cascade,
chunk_index integer not null,
content text not null,
metadata jsonb,
vector_id varchar(255),
created_at timestamp with time zone default CURRENT_TIMESTAMP,
summary text
);
alter table public.knowledge_base_chunk
owner to zuoleiroot;
create index idx_kb_chunk_file_id
on public.knowledge_base_chunk (file_id);
create index idx_kb_chunk_kb_id
on public.knowledge_base_chunk (knowledge_base_id);
create index idx_kb_chunk_vector_id
on public.knowledge_base_chunk (vector_id);
create index idx_kb_chunk_metadata
on public.knowledge_base_chunk using gin (metadata);
create table public.chat_thread_file
(
id serial
primary key,
thread_id varchar(255) not null,
user_id integer not null
constraint fk_chat_thread_file_user
references public.user_list
on delete cascade,
file_name varchar(255) not null,
file_path varchar(500) not null,
file_size integer default 0,
file_type varchar(50) default 'pdf'::character varying,
status varchar(20) default 'processing'::character varying,
chunk_count integer default 0,
created_at timestamp with time zone default CURRENT_TIMESTAMP,
updated_at timestamp with time zone default CURRENT_TIMESTAMP,
is_deleted boolean default false,
deleted_at timestamp with time zone
);
alter table public.chat_thread_file
owner to zuoleiroot;
create index idx_chat_thread_file_thread_id
on public.chat_thread_file (thread_id);
create index idx_chat_thread_file_user_id
on public.chat_thread_file (user_id);
create index idx_chat_thread_file_thread_user
on public.chat_thread_file (thread_id, user_id);
create index idx_chat_thread_file_status
on public.chat_thread_file (status);
create index idx_chat_thread_file_is_deleted
on public.chat_thread_file (is_deleted);
create index idx_chat_thread_file_created_at
on public.chat_thread_file (created_at);
create index idx_chat_thread_file_thread_deleted
on public.chat_thread_file (thread_id, is_deleted);
create unique index uk_chat_thread_file_thread_name_active
on public.chat_thread_file (thread_id, file_name)
where (is_deleted = false);
create table public.chat_thread_chunk
(
id serial
primary key,
file_id integer not null
constraint fk_chat_thread_chunk_file
references public.chat_thread_file
on delete cascade,
thread_id varchar(255) not null,
chunk_index integer not null,
content text not null,
metadata jsonb,
vector_id varchar(255),
created_at timestamp with time zone default CURRENT_TIMESTAMP,
summary text
);
alter table public.chat_thread_chunk
owner to zuoleiroot;
create index idx_chat_thread_chunk_file_id
on public.chat_thread_chunk (file_id);
create index idx_chat_thread_chunk_thread_id
on public.chat_thread_chunk (thread_id);
create index idx_chat_thread_chunk_file_thread
on public.chat_thread_chunk (file_id, thread_id);
create index idx_chat_thread_chunk_vector_id
on public.chat_thread_chunk (vector_id);
create index idx_chat_thread_chunk_created_at
on public.chat_thread_chunk (created_at);
create table public.chat_message_file
(
id serial
primary key,
thread_id varchar(255) not null,
checkpoint_id varchar(255) not null,
message_index integer not null,
file_id integer not null
constraint fk_chat_message_file_file
references public.chat_thread_file
on delete cascade,
created_at timestamp with time zone default CURRENT_TIMESTAMP,
constraint uk_message_file
unique (checkpoint_id, message_index, file_id)
);
alter table public.chat_message_file
owner to zuoleiroot;
create index idx_chat_message_file_thread_id
on public.chat_message_file (thread_id);
create index idx_chat_message_file_checkpoint
on public.chat_message_file (checkpoint_id, message_index);
create index idx_chat_message_file_file_id
on public.chat_message_file (file_id);
create index idx_chat_message_file_thread_checkpoint
on public.chat_message_file (thread_id, checkpoint_id);
create table public.graphs
(
id serial
primary key,
user_id integer not null
constraint fk_graphs_user
references public.user_list
on delete cascade,
name varchar(255) not null,
description text,
csv_file_name varchar(255),
node_count integer default 0,
edge_count integer default 0,
neo4j_graph_id varchar(100) not null
unique,
graph_type varchar(20) default 'knowledge'::character varying not null,
build_status varchar(20),
build_error text,
rag_chunk_count integer default 0 not null,
created_at timestamp with time zone default CURRENT_TIMESTAMP,
updated_at timestamp with time zone default CURRENT_TIMESTAMP,
enterprise_id integer not null
references public.enterprise,
department_id integer
references public.department
on delete set null,
creator_id integer not null
references public.user_list
on delete set null,
visibility varchar(32) default 'private'::character varying not null
constraint ck_graphs_visibility
check ((visibility)::text = ANY
((ARRAY ['private'::character varying, 'department'::character varying, 'enterprise'::character varying])::text[]))
);
comment on table public.graphs is '知识图谱元数据表,图数据在 Neo4j向量块数量见 rag_chunk_count';
comment on column public.graphs.neo4j_graph_id is 'Neo4j 中图谱唯一标识';
comment on column public.graphs.graph_type is '兼容字段,默认 knowledge';
comment on column public.graphs.build_status is '构建状态pending/processing/completed/failed';
comment on column public.graphs.build_error is '构建失败时的错误信息';
comment on column public.graphs.rag_chunk_count is 'Chroma 中知识图谱 RAG 分块数量';
comment on column public.graphs.creator_id is '创建者(与 user_id 通常一致,用于权限判断)';
comment on column public.graphs.visibility is 'private | department | enterprise';
alter table public.graphs
owner to zuoleiroot;
create index idx_graphs_user_id
on public.graphs (user_id);
create index idx_graphs_created_at
on public.graphs (created_at desc);
create index idx_graphs_neo4j_id
on public.graphs (neo4j_graph_id);
create index idx_graphs_graph_type
on public.graphs (user_id, graph_type);
create index idx_graphs_enterprise
on public.graphs (enterprise_id);
create index idx_graphs_creator
on public.graphs (creator_id);
create index idx_graphs_ent_vis
on public.graphs (enterprise_id, visibility);
create table public.chat_threads
(
id serial
primary key,
thread_id varchar(255) not null
constraint uk_thread_id
unique,
user_id integer not null
constraint fk_user_id
references public.user_list
on delete cascade,
title varchar(50) not null,
first_query text not null,
created_at timestamp with time zone default CURRENT_TIMESTAMP,
updated_at timestamp with time zone default CURRENT_TIMESTAMP,
message_count integer default 1,
is_deleted boolean default false,
knowledge_base_id integer,
novel_graph_id integer,
knowledge_graph_id integer
constraint fk_chat_threads_knowledge_graph
references public.graphs
on delete set null,
ip varchar(128)
);
comment on table public.chat_threads is '聊天会话记录表,记录每个用户的会话基本信息';
comment on column public.chat_threads.id is '主键 ID';
comment on column public.chat_threads.thread_id is '会话线程 IDUUID 格式)';
comment on column public.chat_threads.user_id is '用户 ID关联 user_list 表';
comment on column public.chat_threads.title is '会话标题首次请求内容的前10个字';
comment on column public.chat_threads.first_query is '首次请求的完整内容';
comment on column public.chat_threads.created_at is '会话创建时间';
comment on column public.chat_threads.updated_at is '最后更新时间';
comment on column public.chat_threads.message_count is '该会话的消息总数';
comment on column public.chat_threads.is_deleted is '是否已删除(软删除标记)';
comment on column public.chat_threads.knowledge_graph_id is '绑定的知识图谱 graphs.id与 knowledge_base_id 二选一';
comment on column public.chat_threads.ip is '最近一次发起聊天时的客户端 IP可选';
alter table public.chat_threads
owner to zuoleiroot;
create index idx_chat_threads_user_id
on public.chat_threads (user_id);
create index idx_chat_threads_created_at
on public.chat_threads (created_at desc);
create index idx_chat_threads_user_created
on public.chat_threads (user_id asc, created_at desc);
create index idx_chat_threads_novel_graph_id
on public.chat_threads (novel_graph_id);
create index idx_chat_threads_knowledge_graph_id
on public.chat_threads (knowledge_graph_id);
create table public.knowledge_processing_task
(
id serial
primary key,
user_id integer not null
constraint fk_kb_processing_user
references public.user_list
on delete cascade,
knowledge_base_id integer not null
constraint fk_kb_processing_kb
references public.knowledge_base
on delete cascade,
task_name varchar(255) not null,
instruction text not null,
file_ids integer[] not null,
task_type varchar(50) not null,
status varchar(20) default 'pending'::character varying,
result text,
result_file_url text,
error_message text,
created_at timestamp with time zone default CURRENT_TIMESTAMP,
updated_at timestamp with time zone default CURRENT_TIMESTAMP,
started_at timestamp with time zone,
completed_at timestamp with time zone
);
comment on table public.knowledge_processing_task is '知识加工任务表:合并、对比、总结等异步任务';
comment on column public.knowledge_processing_task.result_file_url is '加工结果文件的 OSS 下载链接';
alter table public.knowledge_processing_task
owner to zuoleiroot;
create index idx_kb_processing_user_id
on public.knowledge_processing_task (user_id);
create index idx_kb_processing_kb_id
on public.knowledge_processing_task (knowledge_base_id);
create index idx_kb_processing_status
on public.knowledge_processing_task (status);
create index idx_kb_processing_created_at
on public.knowledge_processing_task (created_at desc);
create index idx_kb_processing_user_status
on public.knowledge_processing_task (user_id, status);
create index idx_department_enterprise_id
on public.department (enterprise_id);