docs: 添加数据库表结构说明 DATABASE_SCHEMA.md

This commit is contained in:
Your Name 2026-02-05 19:36:33 +08:00
parent 049f01059f
commit 503196d2ae

371
DATABASE_SCHEMA.md Normal file
View File

@ -0,0 +1,371 @@
# 数据库表结构说明
本文档描述项目使用的 PostgreSQL 数据库表及字段,便于配置数据库、排查问题或二次开发。
表名与代码中 `lib/db/schema.ts` 一致,迁移文件位于 `lib/db/migrations/`。
---
## 1. User(用户表)
| 字段名 | 类型 | 必填 | 默认 | 说明 |
|--------|------|------|------|------|
| id | uuid | 是 | defaultRandom() | 主键 |
| email | varchar(64) | 是 | - | 邮箱 |
| password | varchar(64) | 否 | - | 密码(可为空,如钉钉登录) |
| name | varchar(100) | 否 | - | 用户姓名(显示用) |
| department | varchar(256) | 否 | - | 部门 |
| dingtalkUserId | varchar(128) | 否 | - | 钉钉用户ID |
| role | varchar | 是 | 'regular' | 角色:guest / regular / admin |
| isActive | boolean | 是 | true | 是否启用 |
| monthlyImageLimit | integer | 否 | - | 每月出图限额,NULL/0 表示无限制 |
| createdAt | timestamp | 是 | now() | 创建时间 |
| updatedAt | timestamp | 是 | now() | 更新时间 |
---
## 2. Chat(会话表)
| 字段名 | 类型 | 必填 | 默认 | 说明 |
|--------|------|------|------|------|
| id | uuid | 是 | defaultRandom() | 主键 |
| createdAt | timestamp | 是 | - | 创建时间 |
| title | text | 是 | - | 会话标题 |
| userId | uuid | 是 | - | 用户ID,外键 → User.id |
| visibility | varchar | 是 | 'private' | 可见性:public / private |
| lastContext | jsonb | 否 | - | 上次使用上下文(AppUsage) |
---
## 3. Message(消息表,新)— 表名:Message_v2
| 字段名 | 类型 | 必填 | 默认 | 说明 |
|--------|------|------|------|------|
| id | uuid | 是 | defaultRandom() | 主键 |
| chatId | uuid | 是 | - | 会话ID,外键 → Chat.id |
| role | varchar | 是 | - | 角色(user/assistant 等) |
| parts | json | 是 | - | 消息内容片段 |
| attachments | json | 是 | - | 附件 |
| createdAt | timestamp | 是 | - | 创建时间 |
| video_storage_status | varchar(20) | 否 | 'temporary' | 视频存储状态 |
| temporary_video_url | text | 否 | - | 临时视频URL |
| permanent_video_url | text | 否 | - | 永久视频URL |
| archived_at | timestamp | 否 | - | 归档时间 |
| video_metadata | jsonb | 否 | - | 视频元数据 |
---
## 4. Message(旧版,已弃用)— 表名:Message
保留兼容,新逻辑请用 Message_v2。
| 字段名 | 类型 | 必填 | 默认 | 说明 |
|--------|------|------|------|------|
| id | uuid | 是 | defaultRandom() | 主键 |
| chatId | uuid | 是 | - | 会话ID |
| role | varchar | 是 | - | 角色 |
| content | json | 是 | - | 内容 |
| createdAt | timestamp | 是 | - | 创建时间 |
---
## 5. Vote_v2(投票表,新)
| 字段名 | 类型 | 必填 | 默认 | 说明 |
|--------|------|------|------|------|
| chatId | uuid | 是 | - | 会话ID,外键 → Chat.id |
| messageId | uuid | 是 | - | 消息ID,外键 → Message_v2.id |
| isUpvoted | boolean | 是 | - | 是否点赞 |
| (主键) | - | - | - | (chatId, messageId) 联合主键 |
---
## 6. Vote(旧版,已弃用)— 表名:Vote
| 字段名 | 类型 | 必填 | 默认 | 说明 |
|--------|------|------|------|------|
| chatId | uuid | 是 | - | 会话ID |
| messageId | uuid | 是 | - | 消息ID(旧 Message 表) |
| isUpvoted | boolean | 是 | - | 是否点赞 |
---
## 7. Document(文档表)
| 字段名 | 类型 | 必填 | 默认 | 说明 |
|--------|------|------|------|------|
| id | uuid | 是 | defaultRandom() | 主键之一 |
| createdAt | timestamp | 是 | - | 主键之一 |
| title | text | 是 | - | 标题 |
| content | text | 否 | - | 内容 |
| text | varchar | 是 | 'text' | 类型:text / code / image / sheet |
| userId | uuid | 是 | - | 用户ID,外键 → User.id |
主键:(id, createdAt)
---
## 8. Suggestion(建议表)
| 字段名 | 类型 | 必填 | 默认 | 说明 |
|--------|------|------|------|------|
| id | uuid | 是 | defaultRandom() | 主键 |
| documentId | uuid | 是 | - | 文档ID |
| documentCreatedAt | timestamp | 是 | - | 文档创建时间 |
| originalText | text | 是 | - | 原文 |
| suggestedText | text | 是 | - | 建议文本 |
| description | text | 否 | - | 描述 |
| isResolved | boolean | 是 | false | 是否已解决 |
| userId | uuid | 是 | - | 用户ID,外键 → User.id |
| createdAt | timestamp | 是 | - | 创建时间 |
---
## 9. Stream(流表)
| 字段名 | 类型 | 必填 | 默认 | 说明 |
|--------|------|------|------|------|
| id | uuid | 是 | defaultRandom() | 主键 |
| chatId | uuid | 是 | - | 会话ID,外键 → Chat.id |
| createdAt | timestamp | 是 | - | 创建时间 |
---
## 10. SystemSettings(系统设置表)
| 字段名 | 类型 | 必填 | 默认 | 说明 |
|--------|------|------|------|------|
| id | uuid | 是 | defaultRandom() | 主键 |
| key | varchar(128) | 是 | - | 配置键,唯一 |
| value | jsonb | 是 | - | 配置值 |
| updatedAt | timestamp | 是 | now() | 更新时间 |
| updatedBy | uuid | 否 | - | 更新人,外键 → User.id |
---
## 11. ToolConfig(工具配置表)
| 字段名 | 类型 | 必填 | 默认 | 说明 |
|--------|------|------|------|------|
| id | uuid | 是 | defaultRandom() | 主键 |
| toolName | varchar(128) | 是 | - | 工具名称,唯一 |
| isEnabled | boolean | 是 | true | 是否启用 |
| description | text | 否 | - | 描述 |
| config | jsonb | 否 | - | 配置 |
| updatedAt | timestamp | 是 | now() | 更新时间 |
| updatedBy | uuid | 否 | - | 更新人,外键 → User.id |
---
## 12. AiProvider(AI 提供商表)
| 字段名 | 类型 | 必填 | 默认 | 说明 |
|--------|------|------|------|------|
| id | uuid | 是 | defaultRandom() | 主键 |
| name | varchar(128) | 是 | - | 提供商名称 |
| type | varchar | 是 | 'custom' | 类型:alibaba / openai / custom / local / gemini / huanke-gemini / qianwen-video / volcano-vision / volcano-video / alibaba-image |
| baseUrl | text | 是 | - | API 基础 URL |
| apiKey | text | 是 | - | API Key |
| isEnabled | boolean | 是 | true | 是否启用 |
| createdAt | timestamp | 是 | now() | 创建时间 |
| updatedAt | timestamp | 是 | now() | 更新时间 |
| updatedBy | uuid | 否 | - | 更新人,外键 → User.id |
---
## 13. AiModel(AI 模型表)
| 字段名 | 类型 | 必填 | 默认 | 说明 |
|--------|------|------|------|------|
| id | uuid | 是 | defaultRandom() | 主键 |
| providerId | uuid | 是 | - | 提供商ID,外键 → AiProvider.id |
| modelId | varchar(128) | 是 | - | 模型ID(如 qwen-turbo) |
| displayName | varchar(128) | 是 | - | 显示名称 |
| description | text | 否 | - | 描述 |
| supportsVision | boolean | 是 | false | 是否支持视觉 |
| supportsImageGen | boolean | 是 | false | 是否支持生图 |
| isEnabled | boolean | 是 | true | 是否启用 |
| isDefault | boolean | 是 | false | 是否默认模型 |
| sortOrder | integer | 是 | 0 | 排序 |
| capabilities | jsonb | 否 | - | 能力配置(如视频) |
| defaultParams | jsonb | 否 | - | 默认参数 |
| is_sub_model | boolean | 是 | false | 是否子模型(不单独展示) |
| parent_model_id | uuid | 否 | - | 父模型ID |
| fallbackModelId1 | varchar(128) | 否 | - | 备用模型ID 1 |
| fallbackModelId2 | varchar(128) | 否 | - | 备用模型ID 2 |
| imageGenConfig | jsonb | 否 | - | 生图配置 |
| createdAt | timestamp | 是 | now() | 创建时间 |
| updatedAt | timestamp | 是 | now() | 更新时间 |
---
## 14. StorageConfig(存储配置表)
| 字段名 | 类型 | 必填 | 默认 | 说明 |
|--------|------|------|------|------|
| id | uuid | 是 | defaultRandom() | 主键 |
| name | varchar(128) | 是 | - | 配置名称 |
| type | varchar | 是 | 's3' | 类型:s3 / local |
| endpoint | text | 否 | - | S3 端点 |
| region | varchar(64) | 否 | - | 区域 |
| bucket | varchar(128) | 否 | - | 存储桶 |
| accessKeyId | text | 否 | - | Access Key ID |
| secretAccessKey | text | 否 | - | Secret Access Key |
| publicUrl | text | 否 | - | 公开访问 URL 前缀 |
| isDefault | boolean | 是 | false | 是否默认存储 |
| isEnabled | boolean | 是 | true | 是否启用 |
| createdAt | timestamp | 是 | now() | 创建时间 |
| updatedAt | timestamp | 是 | now() | 更新时间 |
| updatedBy | uuid | 否 | - | 更新人,外键 → User.id |
---
## 15. SiteSettings(网站设置表)
| 字段名 | 类型 | 必填 | 默认 | 说明 |
|--------|------|------|------|------|
| id | uuid | 是 | defaultRandom() | 主键 |
| siteName | varchar(128) | 是 | 'AI Chatbot' | 站点名称 |
| siteLogo | text | 否 | - | 站点 LOGO(日间) |
| siteLogoDark | text | 否 | - | 站点 LOGO(夜间) |
| favicon | text | 否 | - | favicon |
| showAutoModel | boolean | 是 | true | 是否显示「自动」模型 |
| defaultTheme | varchar(16) | 是 | 'system' | 默认主题:system / light / dark |
| usageTimeEnabled | boolean | 是 | false | 是否启用使用时间限制 |
| usageTimeStart | varchar(5) | 否 | '08:00' | 开始时间 HH:mm |
| usageTimeEnd | varchar(5) | 否 | '20:00' | 结束时间 HH:mm |
| usageTimeMessage | text | 否 | - | 超时提示文案 |
| bannerEnabled | boolean | 是 | true | 是否显示广告横幅 |
| bannerText | text | 否 | - | 横幅文案 |
| bannerLink | text | 否 | - | 横幅链接 |
| toolbox1Name | varchar(64) | 否 | '工具箱' | 工具箱1名称 |
| toolbox1Enabled | boolean | 是 | true | 工具箱1是否显示 |
| toolbox2Name | varchar(64) | 否 | '工具箱2' | 工具箱2名称 |
| toolbox2Enabled | boolean | 是 | false | 工具箱2是否显示 |
| tutorialVideoUrl | text | 否 | - | 教程视频链接 |
| tutorialEnabled | boolean | 是 | false | 是否显示教程 |
| rankingEnabled | boolean | 是 | true | 是否显示精选榜 |
| canvasEnabled | boolean | 是 | true | 是否启用无限画布 |
| canvasDefaultModelId | varchar(128) | 否 | - | 画布默认模型ID |
| canvasAutoModeDefaultModelId | varchar(128) | 否 | - | 画布智能自动模式默认模型ID |
| updatedAt | timestamp | 是 | now() | 更新时间 |
| updatedBy | uuid | 否 | - | 更新人,外键 → User.id |
---
## 16. NavLinks(导航链接表)
| 字段名 | 类型 | 必填 | 默认 | 说明 |
|--------|------|------|------|------|
| id | uuid | 是 | defaultRandom() | 主键 |
| name | varchar(64) | 是 | - | 名称 |
| url | text | 是 | - | 链接 |
| order | integer | 是 | 0 | 排序 |
| isEnabled | boolean | 是 | true | 是否启用 |
| toolboxGroup | integer | 是 | 1 | 工具箱分组:1 或 2 |
| createdAt | timestamp | 是 | now() | 创建时间 |
| updatedAt | timestamp | 是 | now() | 更新时间 |
| createdBy | uuid | 否 | - | 创建人,外键 → User.id |
---
## 17. TutorialVideos(教程视频表)
| 字段名 | 类型 | 必填 | 默认 | 说明 |
|--------|------|------|------|------|
| id | uuid | 是 | defaultRandom() | 主键 |
| title | varchar(128) | 是 | - | 标题 |
| videoUrl | text | 是 | - | 视频链接 |
| coverUrl | text | 否 | - | 封面图链接 |
| description | text | 否 | - | 描述 |
| order | integer | 是 | 0 | 排序 |
| isEnabled | boolean | 是 | true | 是否启用 |
| createdAt | timestamp | 是 | now() | 创建时间 |
| updatedAt | timestamp | 是 | now() | 更新时间 |
| createdBy | uuid | 否 | - | 创建人,外键 → User.id |
---
## 18. AuthSettings(认证配置表)
| 字段名 | 类型 | 必填 | 默认 | 说明 |
|--------|------|------|------|------|
| id | uuid | 是 | defaultRandom() | 主键 |
| dingTalkAppKey | text | 否 | - | 钉钉 AppKey |
| dingTalkAppSecret | text | 否 | - | 钉钉 AppSecret |
| dingTalkOrganizations | jsonb | 否 | - | 多组织钉钉配置 [{ name, appKey, appSecret }] |
| isDingTalkEnabled | boolean | 是 | false | 是否启用钉钉登录 |
| isRegistrationEnabled | boolean | 是 | true | 是否开放注册 |
| updatedAt | timestamp | 是 | now() | 更新时间 |
| updatedBy | uuid | 否 | - | 更新人,外键 → User.id |
---
## 19. LoginToken(临时登录令牌表)
| 字段名 | 类型 | 必填 | 默认 | 说明 |
|--------|------|------|------|------|
| id | uuid | 是 | defaultRandom() | 主键 |
| token | text | 是 | - | 令牌,唯一 |
| email | varchar(64) | 是 | - | 邮箱 |
| expiresAt | timestamp | 是 | - | 过期时间 |
| createdAt | timestamp | 是 | now() | 创建时间 |
---
## 20. GeneratedImage(生成图片记录表)
| 字段名 | 类型 | 必填 | 默认 | 说明 |
|--------|------|------|------|------|
| id | uuid | 是 | defaultRandom() | 主键 |
| userId | uuid | 是 | - | 用户ID,外键 → User.id |
| chatId | uuid | 否 | - | 会话ID,外键 → Chat.id |
| messageId | uuid | 否 | - | 消息ID |
| thumbnailUrl | text | 是 | - | 缩略图 URL |
| originalUrl | text | 是 | - | 原图 URL |
| imageSize | varchar(10) | 否 | '2K' | 图片尺寸 |
| prompt | text | 否 | - | 提示词 |
| modelId | varchar(128) | 否 | - | 模型ID |
| isFeatured | boolean | 是 | false | 是否精选 |
| featuredAt | timestamp | 否 | - | 精选时间 |
| featuredBy | uuid | 否 | - | 精选操作人,外键 → User.id |
| createdAt | timestamp | 是 | now() | 创建时间 |
---
## 21. CanvasProject(画布项目表)
| 字段名 | 类型 | 必填 | 默认 | 说明 |
|--------|------|------|------|------|
| id | uuid | 是 | defaultRandom() | 主键 |
| userId | uuid | 是 | - | 用户ID,外键 → User.id |
| title | varchar(256) | 是 | '未命名画布' | 标题 |
| description | text | 否 | - | 描述 |
| thumbnail | text | 否 | - | 缩略图 URL |
| canvasData | jsonb | 否 | - | 画布数据 { nodes, edges, viewport } |
| createdAt | timestamp | 是 | now() | 创建时间 |
| updatedAt | timestamp | 是 | now() | 更新时间 |
---
## 22. CanvasNode(画布节点表)
| 字段名 | 类型 | 必填 | 默认 | 说明 |
|--------|------|------|------|------|
| id | uuid | 是 | defaultRandom() | 主键 |
| projectId | uuid | 是 | - | 画布项目ID,外键 → CanvasProject.id |
| type | varchar(32) | 是 | - | 类型:message / image / video / text / scene-fusion |
| position | jsonb | 否 | - | 位置 { x, y } |
| size | jsonb | 否 | - | 尺寸 { width, height } |
| data | jsonb | 否 | - | 节点数据 |
| connections | jsonb | 否 | [] | 连接列表 |
| parentId | uuid | 否 | - | 父节点ID |
| createdAt | timestamp | 是 | now() | 创建时间 |
| updatedAt | timestamp | 是 | now() | 更新时间 |
---
## 使用说明
- **建表**:项目使用 Drizzle 迁移,首次部署请执行 `pnpm run db:migrate` 或项目内定义的迁移命令,表会按 `lib/db/migrations/` 中的 SQL 自动创建/更新。
- **连接**:数据库连接由环境变量配置(如 `POSTGRES_URL`),请勿将包含密码的 `.env` 提交到仓库。
- **系统配置**:部分功能依赖 `SystemSettings` 表中的 key(如 `scene_fusion_config`、站点相关 key),具体 key 名见代码中 `getSystemSetting` 的用法。