数据库设计
本节提供了用于存储聊天历史记录的 PostgreSQL 数据库表的设计,包括表结构、字段说明及关系定义。
表结构
chats 表
存储所有的聊天记录的基本信息。
CREATE TABLE chats (
id UUID PRIMARY KEY, -- 聊天的唯一标识符
title TEXT NOT NULL, -- 聊天标题
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(), -- 聊天创建时间
focus_mode VARCHAR(50) NOT NULL, -- 聊天的焦点模式,如 webSearch
-- 其他相关字段可以根据需求添加
);
字段说明:
- id: 使用 UUID 作为主键,确保唯一性。
- title: 聊天的标题,通常为用户的初始问题。
- created_at: 聊天的创建时间,默认值为当前时间。
- focus_mode: 聊天的焦点模式,例如
webSearch
。
messages 表
存储每个聊天中的消息内容及相关信息。
CREATE TABLE messages (
id SERIAL PRIMARY KEY, -- 消息的唯一标识符(自增ID)
message_id UUID NOT NULL UNIQUE, -- 消息的唯一标识符(UUID)
chat_id UUID REFERENCES chats(id) ON DELETE CASCADE, -- 关联的聊天记录ID
content TEXT NOT NULL, -- 消息内容
role VARCHAR(20) NOT NULL, -- 消息角色,如 user 或 assistant
metadata JSONB, -- 额外的元数据信息,存储为JSONB类型
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW() -- 消息创建时间
);
字段说明:
- id: 自增主键,用于内部管理。
- message_id: 消息的唯一标识符,确保全局唯一性。
- chat_id: 外键,关联到
chats
表中的id
字段。若关联的聊天记录被删除,则对应的消息也会被删除。 - content: 消息的具体内容。
- role: 消息的角色,标识消息是由用户发送还是助手生成,如
user
或assistant
。 - metadata: 存储额外的元数据信息,例如创建时间、来源等,使用
JSONB
类型以支持高效的查询。 - created_at: 消息的创建时间,默认值为当前时间。
files 表
存储与聊天相关的文件信息(当前数据中files
数组为空,但预留此表以备未来使用)。
CREATE TABLE files (
id SERIAL PRIMARY KEY, -- 文件的唯一标识符
chat_id UUID REFERENCES chats(id) ON DELETE CASCADE, -- 关联的聊天记录ID
file_name TEXT NOT NULL, -- 文件名称
file_url TEXT NOT NULL, -- 文件访问URL
uploaded_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW() -- 文件上传时间
);
字段说明:
- id: 自增主键,用于内部管理。
- chat_id: 外键,关联到
chats
表中的id
字段。若关联的聊天记录被删除,则对应的文件记录也会被删除。 - file_name: 文件的名称。
- file_url: 文件的访问 URL。
- uploaded_at: 文件的上传时间,默认值为当前时间。
表关系图
chats (1) ----- (M) messages
|
|
+----- (M) files
- chats 表与 messages 表之间是一对多的关系。
- chats 表与 files 表之间也是一对多的关系。
附录
数据库字段类型选择说明
- UUID: 选择 UUID 作为主要标识符,提供更高的唯一性和安全性,避免可预测性。
- JSONB: 使用
JSONB
类型存储metadata
字段,允许高效的存储和查询结构化数据。 - TIMESTAMP WITH TIME ZONE: 存储带时区的时间戳,确保时间的一致性和准确性。
索引设计建议
为优化查询性能,建议在以下字段上创建索引:
messages.message_id: 为
message_id
字段创建唯一索引,快速查找特定消息。CREATE UNIQUE INDEX idx_messages_message_id ON messages(message_id);
messages.chat_id: 为
chat_id
字段创建索引,加速按聊天记录查询消息。CREATE INDEX idx_messages_chat_id ON messages(chat_id);
files.chat_id: 为
chat_id
字段创建索引,加速按聊天记录查询文件。CREATE INDEX idx_files_chat_id ON files(chat_id);
chats.created_at: 根据需要,可为
created_at
字段创建索引,以支持按时间排序或过滤。CREATE INDEX idx_chats_created_at ON chats(created_at);
安全与权限
确保数据库的安全性,建议采取以下措施:
- 最小权限原则: 数据库用户仅拥有其完成任务所需的最低权限。
- 数据加密: 对敏感数据进行加密存储,尤其是 API 密钥等信息。
- 备份策略: 定期备份数据库,确保数据的可恢复性。
- 访问控制: 实施严格的访问控制策略,防止未经授权的访问。
数据完整性与约束
- 外键约束: 确保
messages
表和files
表中的chat_id
必须存在于chats
表中。 - 唯一性约束:
messages.message_id
必须唯一,防止重复消息记录。 - 非空约束: 关键字段如
title
、content
、role
等应设置为非空,以保证数据完整性。
以上文档为您的 AI+搜索产品的历史记录功能提供了详细的 API 说明和数据库设计方案,确保系统的高效、可靠和可扩展性。如需进一步的信息或有任何疑问,请联系开发团队或参考相关技术文档。