Skip to content

Commit d39eae0

Browse files
authored
update schema
1 parent 8f4872e commit d39eae0

File tree

7 files changed

+651
-626
lines changed

7 files changed

+651
-626
lines changed

docs/developer/database-schema.dbml

+13
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,10 @@ table files {
122122
accessed_at "timestamp with time zone" [not null, default: `now()`]
123123
created_at "timestamp with time zone" [not null, default: `now()`]
124124
updated_at "timestamp with time zone" [not null, default: `now()`]
125+
126+
indexes {
127+
file_hash [name: 'file_hash_idx']
128+
}
125129
}
126130

127131
table global_files {
@@ -130,13 +134,15 @@ table global_files {
130134
size integer [not null]
131135
url text [not null]
132136
metadata jsonb
137+
creator text [not null]
133138
created_at "timestamp with time zone" [not null, default: `now()`]
134139
accessed_at "timestamp with time zone" [not null, default: `now()`]
135140
}
136141

137142
table knowledge_base_files {
138143
knowledge_base_id text [not null]
139144
file_id text [not null]
145+
user_id text [not null]
140146
created_at "timestamp with time zone" [not null, default: `now()`]
141147

142148
indexes {
@@ -161,6 +167,7 @@ table knowledge_bases {
161167
table message_chunks {
162168
message_id text
163169
chunk_id uuid
170+
user_id text [not null]
164171

165172
indexes {
166173
(chunk_id, message_id) [pk]
@@ -176,13 +183,15 @@ table message_plugins {
176183
identifier text
177184
state jsonb
178185
error jsonb
186+
user_id text [not null]
179187
}
180188

181189
table message_queries {
182190
id uuid [pk, not null, default: `gen_random_uuid()`]
183191
message_id text [not null]
184192
rewrite_query text
185193
user_query text
194+
user_id text [not null]
186195
embeddings_id uuid
187196
}
188197

@@ -191,6 +200,7 @@ table message_query_chunks {
191200
query_id uuid
192201
chunk_id uuid
193202
similarity "numeric(6, 5)"
203+
user_id text [not null]
194204

195205
indexes {
196206
(chunk_id, id, query_id) [pk]
@@ -202,13 +212,15 @@ table message_tts {
202212
content_md5 text
203213
file_id text
204214
voice text
215+
user_id text [not null]
205216
}
206217

207218
table message_translates {
208219
id text [pk, not null]
209220
content text
210221
from text
211222
to text
223+
user_id text [not null]
212224
}
213225

214226
table messages {
@@ -249,6 +261,7 @@ table messages {
249261
table messages_files {
250262
file_id text [not null]
251263
message_id text [not null]
264+
user_id text [not null]
252265

253266
indexes {
254267
(file_id, message_id) [pk]

src/database/client/migrations.json

+50-13
Original file line numberDiff line numberDiff line change
@@ -326,26 +326,63 @@
326326
},
327327
{
328328
"sql": [
329-
"-- Simplified user_id migration script\n-- Contains three basic steps\n\nBEGIN;",
330-
"\n\n-- Step 1: Add nullable user_id columns\nALTER TABLE \"agents_to_sessions\" ADD COLUMN IF NOT EXISTS \"user_id\" text;",
329+
"-- 完整的用户ID迁移脚本\n-- 包含所有表的字段添加、数据填充和约束设置\n\nBEGIN;",
330+
"\n\nCREATE INDEX \"file_hash_idx\" ON \"files\" USING btree (\"file_hash\");\n\n-- 步骤 1: 添加可为空的 user_id 列到所有需要的表\nALTER TABLE \"global_files\" ADD COLUMN IF NOT EXISTS \"creator\" text;",
331+
"\nALTER TABLE \"knowledge_base_files\" ADD COLUMN IF NOT EXISTS \"user_id\" text;",
332+
"\nALTER TABLE \"message_chunks\" ADD COLUMN IF NOT EXISTS \"user_id\" text;",
333+
"\nALTER TABLE \"message_plugins\" ADD COLUMN IF NOT EXISTS \"user_id\" text;",
334+
"\nALTER TABLE \"message_queries\" ADD COLUMN IF NOT EXISTS \"user_id\" text;",
335+
"\nALTER TABLE \"message_query_chunks\" ADD COLUMN IF NOT EXISTS \"user_id\" text;",
336+
"\nALTER TABLE \"message_tts\" ADD COLUMN IF NOT EXISTS \"user_id\" text;",
337+
"\nALTER TABLE \"message_translates\" ADD COLUMN IF NOT EXISTS \"user_id\" text;",
338+
"\nALTER TABLE \"messages_files\" ADD COLUMN IF NOT EXISTS \"user_id\" text;",
339+
"\nALTER TABLE \"agents_to_sessions\" ADD COLUMN IF NOT EXISTS \"user_id\" text;",
331340
"\nALTER TABLE \"file_chunks\" ADD COLUMN IF NOT EXISTS \"user_id\" text;",
332341
"\nALTER TABLE \"files_to_sessions\" ADD COLUMN IF NOT EXISTS \"user_id\" text;",
333-
"\n\n-- Step 2: Populate user_id fields\n-- Populate user_id for agents_to_sessions\nUPDATE \"agents_to_sessions\" AS ats\nSET \"user_id\" = a.\"user_id\"\nFROM \"agents\" AS a\nWHERE ats.\"agent_id\" = a.\"id\";",
334-
"\n\n-- Populate user_id for file_chunks\nUPDATE \"file_chunks\" AS fc\nSET \"user_id\" = f.\"user_id\"\nFROM \"files\" AS f\nWHERE fc.\"file_id\" = f.\"id\";",
335-
"\n\n-- Populate user_id for files_to_sessions\nUPDATE \"files_to_sessions\" AS fts\nSET \"user_id\" = f.\"user_id\"\nFROM \"files\" AS f\nWHERE fts.\"file_id\" = f.\"id\";",
336-
"\n\n-- Get user_id from sessions table (for handling potential NULL values)\nUPDATE \"files_to_sessions\" AS fts\nSET \"user_id\" = s.\"user_id\"\nFROM \"sessions\" AS s\nWHERE fts.\"session_id\" = s.\"id\" AND fts.\"user_id\" IS NULL;",
337-
"\n\nUPDATE \"agents_to_sessions\" AS ats\nSET \"user_id\" = s.\"user_id\"\nFROM \"sessions\" AS s\nWHERE ats.\"session_id\" = s.\"id\" AND ats.\"user_id\" IS NULL;",
338-
"\n\n-- Step 3: Add NOT NULL constraints and foreign keys\nALTER TABLE \"agents_to_sessions\" ALTER COLUMN \"user_id\" SET NOT NULL;",
342+
"\n\n-- 步骤 2: 填充 user_id 字段\n-- 从关联表中获取 user_id\n\n-- 为 knowledge_base_files 填充 user_id\nUPDATE \"knowledge_base_files\" AS kbf\nSET \"user_id\" = kb.\"user_id\"\n FROM \"knowledge_bases\" AS kb\nWHERE kbf.\"knowledge_base_id\" = kb.\"id\";",
343+
"\n\n-- 为 message_chunks 填充 user_id\nUPDATE \"message_chunks\" AS mc\nSET \"user_id\" = m.\"user_id\"\n FROM \"messages\" AS m\nWHERE mc.\"message_id\" = m.\"id\";",
344+
"\n\n-- 为 message_plugins 填充 user_id (直接从 messages 表获取)\n-- 修改: 将 LIKE 改为 =\nUPDATE \"message_plugins\" AS mp\nSET \"user_id\" = m.\"user_id\"\n FROM \"messages\" AS m\nWHERE mp.\"id\" = m.\"id\";",
345+
"\n\n-- 为 message_queries 填充 user_id\nUPDATE \"message_queries\" AS mq\nSET \"user_id\" = m.\"user_id\"\n FROM \"messages\" AS m\nWHERE mq.\"message_id\" = m.\"id\";",
346+
"\n\n-- 为 message_query_chunks 填充 user_id\nUPDATE \"message_query_chunks\" AS mqc\nSET \"user_id\" = mq.\"user_id\"\n FROM \"message_queries\" AS mq\nWHERE mqc.\"query_id\" = mq.\"id\";",
347+
"\n\n-- 为 message_tts 填充 user_id\nUPDATE \"message_tts\" AS mt\nSET \"user_id\" = m.\"user_id\"\n FROM \"messages\" AS m\nWHERE mt.\"id\" = m.\"id\";",
348+
"\n\n-- 为 message_translates 填充 user_id\nUPDATE \"message_translates\" AS mt\nSET \"user_id\" = m.\"user_id\"\n FROM \"messages\" AS m\nWHERE mt.\"id\" = m.\"id\";",
349+
"\n\n-- 为 messages_files 填充 user_id\nUPDATE \"messages_files\" AS mf\nSET \"user_id\" = m.\"user_id\"\n FROM \"messages\" AS m\nWHERE mf.\"message_id\" = m.\"id\";",
350+
"\n\n-- 为 global_files 填充 creator (从 files 表获取第一个创建该文件的用户)\nUPDATE \"global_files\" AS gf\nSET \"creator\" = (\n SELECT f.\"user_id\"\n FROM \"files\" AS f\n WHERE f.\"file_hash\" = gf.\"hash_id\"\n ORDER BY f.\"created_at\" ASC\n LIMIT 1\n );",
351+
"\n\n-- 删除在 files 表中找不到任何用户使用过的 global_files 记录\nDELETE FROM \"global_files\"\nWHERE \"creator\" IS NULL;",
352+
"\n\n-- 为 agents_to_sessions 填充 user_id\nUPDATE \"agents_to_sessions\" AS ats\nSET \"user_id\" = a.\"user_id\"\n FROM \"agents\" AS a\nWHERE ats.\"agent_id\" = a.\"id\";",
353+
"\n\n-- 为 file_chunks 填充 user_id\nUPDATE \"file_chunks\" AS fc\nSET \"user_id\" = f.\"user_id\"\n FROM \"files\" AS f\nWHERE fc.\"file_id\" = f.\"id\";",
354+
"\n\n-- 为 files_to_sessions 填充 user_id\nUPDATE \"files_to_sessions\" AS fts\nSET \"user_id\" = f.\"user_id\"\n FROM \"files\" AS f\nWHERE fts.\"file_id\" = f.\"id\";",
355+
"\n\n-- 从 sessions 表获取 user_id (处理潜在的 NULL 值)\nUPDATE \"files_to_sessions\" AS fts\nSET \"user_id\" = s.\"user_id\"\n FROM \"sessions\" AS s\nWHERE fts.\"session_id\" = s.\"id\" AND fts.\"user_id\" IS NULL;",
356+
"\n\nUPDATE \"agents_to_sessions\" AS ats\nSET \"user_id\" = s.\"user_id\"\n FROM \"sessions\" AS s\nWHERE ats.\"session_id\" = s.\"id\" AND ats.\"user_id\" IS NULL;",
357+
"\n\n-- 步骤 3: 检查是否有未填充的记录\nDO $$\nDECLARE\nkb_files_count INTEGER;\n msg_chunks_count INTEGER;\n msg_plugins_count INTEGER;\n msg_queries_count INTEGER;\n msg_query_chunks_count INTEGER;\n msg_tts_count INTEGER;\n msg_translates_count INTEGER;\n msgs_files_count INTEGER;\n agents_sessions_count INTEGER;\n file_chunks_count INTEGER;\n files_sessions_count INTEGER;\nBEGIN\nSELECT COUNT(*) INTO kb_files_count FROM \"knowledge_base_files\" WHERE \"user_id\" IS NULL;\nSELECT COUNT(*) INTO msg_chunks_count FROM \"message_chunks\" WHERE \"user_id\" IS NULL;\nSELECT COUNT(*) INTO msg_plugins_count FROM \"message_plugins\" WHERE \"user_id\" IS NULL;\nSELECT COUNT(*) INTO msg_queries_count FROM \"message_queries\" WHERE \"user_id\" IS NULL;\nSELECT COUNT(*) INTO msg_query_chunks_count FROM \"message_query_chunks\" WHERE \"user_id\" IS NULL;\nSELECT COUNT(*) INTO msg_tts_count FROM \"message_tts\" WHERE \"user_id\" IS NULL;\nSELECT COUNT(*) INTO msg_translates_count FROM \"message_translates\" WHERE \"user_id\" IS NULL;\nSELECT COUNT(*) INTO msgs_files_count FROM \"messages_files\" WHERE \"user_id\" IS NULL;\nSELECT COUNT(*) INTO agents_sessions_count FROM \"agents_to_sessions\" WHERE \"user_id\" IS NULL;\nSELECT COUNT(*) INTO file_chunks_count FROM \"file_chunks\" WHERE \"user_id\" IS NULL;\nSELECT COUNT(*) INTO files_sessions_count FROM \"files_to_sessions\" WHERE \"user_id\" IS NULL;\n\nIF kb_files_count > 0 OR msg_chunks_count > 0 OR msg_plugins_count > 0 OR\n msg_queries_count > 0 OR msg_query_chunks_count > 0 OR msg_tts_count > 0 OR\n msg_translates_count > 0 OR msgs_files_count > 0 OR agents_sessions_count > 0 OR\n file_chunks_count > 0 OR files_sessions_count > 0 THEN\n RAISE EXCEPTION 'There are records with NULL user_id values that could not be populated';\nEND IF;\nEND $$;",
358+
"\n\n-- 步骤 4: 添加 NOT NULL 约束和外键\nALTER TABLE \"knowledge_base_files\" ALTER COLUMN \"user_id\" SET NOT NULL;",
359+
"\nALTER TABLE \"message_chunks\" ALTER COLUMN \"user_id\" SET NOT NULL;",
360+
"\nALTER TABLE \"message_plugins\" ALTER COLUMN \"user_id\" SET NOT NULL;",
361+
"\nALTER TABLE \"message_queries\" ALTER COLUMN \"user_id\" SET NOT NULL;",
362+
"\nALTER TABLE \"message_query_chunks\" ALTER COLUMN \"user_id\" SET NOT NULL;",
363+
"\nALTER TABLE \"message_tts\" ALTER COLUMN \"user_id\" SET NOT NULL;",
364+
"\nALTER TABLE \"message_translates\" ALTER COLUMN \"user_id\" SET NOT NULL;",
365+
"\nALTER TABLE \"messages_files\" ALTER COLUMN \"user_id\" SET NOT NULL;",
366+
"\nALTER TABLE \"agents_to_sessions\" ALTER COLUMN \"user_id\" SET NOT NULL;",
339367
"\nALTER TABLE \"file_chunks\" ALTER COLUMN \"user_id\" SET NOT NULL;",
340368
"\nALTER TABLE \"files_to_sessions\" ALTER COLUMN \"user_id\" SET NOT NULL;",
341-
"\n\nALTER TABLE \"agents_to_sessions\"\n ADD CONSTRAINT \"agents_to_sessions_user_id_users_id_fk\"\n FOREIGN KEY (\"user_id\") REFERENCES \"public\".\"users\"(\"id\")\n ON DELETE CASCADE ON UPDATE NO ACTION;",
342-
"\n\nALTER TABLE \"file_chunks\"\n ADD CONSTRAINT \"file_chunks_user_id_users_id_fk\"\n FOREIGN KEY (\"user_id\") REFERENCES \"public\".\"users\"(\"id\")\n ON DELETE CASCADE ON UPDATE NO ACTION;",
343-
"\n\nALTER TABLE \"files_to_sessions\"\n ADD CONSTRAINT \"files_to_sessions_user_id_users_id_fk\"\n FOREIGN KEY (\"user_id\") REFERENCES \"public\".\"users\"(\"id\")\n ON DELETE CASCADE ON UPDATE NO ACTION;",
369+
"\n\n-- 添加外键约束\nALTER TABLE \"global_files\"\n ADD CONSTRAINT \"global_files_creator_users_id_fk\"\n FOREIGN KEY (\"creator\") REFERENCES \"public\".\"users\"(\"id\")\n ON DELETE SET NULL ON UPDATE NO ACTION;",
370+
"\n\nALTER TABLE \"knowledge_base_files\"\n ADD CONSTRAINT \"knowledge_base_files_user_id_users_id_fk\"\n FOREIGN KEY (\"user_id\") REFERENCES \"public\".\"users\"(\"id\")\n ON DELETE CASCADE ON UPDATE NO ACTION;",
371+
"\n\nALTER TABLE \"message_chunks\"\n ADD CONSTRAINT \"message_chunks_user_id_users_id_fk\"\n FOREIGN KEY (\"user_id\") REFERENCES \"public\".\"users\"(\"id\")\n ON DELETE CASCADE ON UPDATE NO ACTION;",
372+
"\n\nALTER TABLE \"message_plugins\"\n ADD CONSTRAINT \"message_plugins_user_id_users_id_fk\"\n FOREIGN KEY (\"user_id\") REFERENCES \"public\".\"users\"(\"id\")\n ON DELETE CASCADE ON UPDATE NO ACTION;",
373+
"\n\nALTER TABLE \"message_queries\"\n ADD CONSTRAINT \"message_queries_user_id_users_id_fk\"\n FOREIGN KEY (\"user_id\") REFERENCES \"public\".\"users\"(\"id\")\n ON DELETE CASCADE ON UPDATE NO ACTION;",
374+
"\n\nALTER TABLE \"message_query_chunks\"\n ADD CONSTRAINT \"message_query_chunks_user_id_users_id_fk\"\n FOREIGN KEY (\"user_id\") REFERENCES \"public\".\"users\"(\"id\")\n ON DELETE CASCADE ON UPDATE NO ACTION;",
375+
"\n\nALTER TABLE \"message_tts\"\n ADD CONSTRAINT \"message_tts_user_id_users_id_fk\"\n FOREIGN KEY (\"user_id\") REFERENCES \"public\".\"users\"(\"id\")\n ON DELETE CASCADE ON UPDATE NO ACTION;",
376+
"\n\nALTER TABLE \"message_translates\"\n ADD CONSTRAINT \"message_translates_user_id_users_id_fk\"\n FOREIGN KEY (\"user_id\") REFERENCES \"public\".\"users\"(\"id\")\n ON DELETE CASCADE ON UPDATE NO ACTION;",
377+
"\n\nALTER TABLE \"messages_files\"\n ADD CONSTRAINT \"messages_files_user_id_users_id_fk\"\n FOREIGN KEY (\"user_id\") REFERENCES \"public\".\"users\"(\"id\")\n ON DELETE CASCADE ON UPDATE NO ACTION;",
378+
"\n\nALTER TABLE \"agents_to_sessions\"\n ADD CONSTRAINT \"agents_to_sessions_user_id_users_id_fk\"\n FOREIGN KEY (\"user_id\") REFERENCES \"public\".\"users\"(\"id\")\n ON DELETE CASCADE ON UPDATE NO ACTION;",
379+
"\n\nALTER TABLE \"file_chunks\"\n ADD CONSTRAINT \"file_chunks_user_id_users_id_fk\"\n FOREIGN KEY (\"user_id\") REFERENCES \"public\".\"users\"(\"id\")\n ON DELETE CASCADE ON UPDATE NO ACTION;",
380+
"\n\nALTER TABLE \"files_to_sessions\"\n ADD CONSTRAINT \"files_to_sessions_user_id_users_id_fk\"\n FOREIGN KEY (\"user_id\") REFERENCES \"public\".\"users\"(\"id\")\n ON DELETE CASCADE ON UPDATE NO ACTION;",
344381
"\n\nCOMMIT;",
345382
"\n"
346383
],
347384
"bps": true,
348-
"folderMillis": 1742233314637,
349-
"hash": "a31b1cc8b1daad073329582ee9890039998fdcc78bfe2b8c43fbae6be37801fb"
385+
"folderMillis": 1742269437903,
386+
"hash": "80b3d7af9d36eae8186aea6b1dc120f72ff76cf45e368352bb0786174caf4834"
350387
}
351388
]

0 commit comments

Comments
 (0)