Files
rag/docs/数据库设计文档.md
lacerate551 cb75b9b274 fix(boundary): 修复多库边界问题、版本管理及删除清理
多库检索与存储修复:
- RRF 融合去重改用 (collection, chunk_id) 复合键,修复同名文件结果被吞
- DocStore 存储路径加 collection 前缀,修复跨库同名切片数据覆盖
- search_multiple 去重改用复合键
- chunk_id 解析改用 rsplit 兼容下划线文件名

上传与版本管理修复:
- 同名文件上传改为覆盖模式,自动清理旧切片
- 修复首次上传不创建版本记录
- 修复覆盖上传版本号回退到 v1
- sync ADDED 分支改用动态版本号生成
- _generate_version_id 改为基于全部版本递增
- 废止/恢复操作同步 SQLite 版本记录
- mark_document_as_superseded 改为仅更新 SQLite

删除清理修复:
- 删除文档时同步清理 SQLite 版本记录和变更日志
- 删除向量库时同步清理该库所有版本记录
- cleanup 改为清理 SQLite 记录而非 ChromaDB

测试:
- test_version_management.py: 27 条版本管理单元测试
- test_edge_cases.py: 28 条边界用例测试
- test_upload_dedup.py: 5 条上传去重测试
- e2e_risk_test.py: 27 条端到端风险测试

文档:
- 新增风险边界问题修复注意事项.md(面向后端的对接文档)
- 新增向量库边界风险分析.md
- 更新多篇现有文档
2026-06-04 23:58:44 +08:00

668 lines
23 KiB
Markdown
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.
# 数据库设计文档
本文档描述 RAG 知识库系统中所有数据库的结构和用途。
> **架构更新**v7.0 重构后,数据库按 prod/dev 环境分离为 4 个独立文件,通过 `data/db.py` 统一管理。生产模式数据库存放于 `data/prod/`,开发模式数据库存放于 `data/dev/`。
---
## 数据库架构概览
### 统一数据访问层
所有数据库通过 `data/db.py` 中的统一接口访问:
```python
from data.db import get_connection, init_databases
# 初始化数据库(首次运行时调用)
init_databases()
# 使用连接可选名称feedback / knowledge / session / exam
with get_connection("feedback") as conn:
cursor = conn.cursor()
cursor.execute("SELECT * FROM feedbacks WHERE user_id = ?", (user_id,))
rows = cursor.fetchall()
```
### 数据库文件列表
| 数据库 | 文件名 | 存储路径 | 主要功能 | 环境 |
|--------|--------|----------|----------|------|
| feedback | `feedback.db` | `data/prod/` | 用户反馈、FAQ、质量报告、FAQ 建议 | 生产 + 开发 |
| knowledge | `knowledge.db` | `data/prod/` | 知识库同步、文档哈希、纲要缓存、版本管理 | 生产 + 开发 |
| session | `session.db` | `data/dev/` | 会话管理、消息历史、审计日志 | 仅开发 |
| exam | `exam.db` | `data/dev/` | 题目存储、试卷管理、批阅记录、分析报告 | 仅开发 |
---
## 1. feedback.db - 反馈系统数据库
**存储路径**`data/prod/feedback.db`
**环境**:生产 + 开发(始终启用)
**所属模块**`services/feedback.py`
### 1.1 feedbacks 表 - 反馈表
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | INTEGER | 自增主键 |
| `session_id` | TEXT | 会话ID |
| `query` | TEXT | 用户问题 |
| `answer` | TEXT | 系统回答 |
| `sources` | TEXT | 来源文档JSON |
| `rating` | INTEGER | 评分1=赞,-1=踩 |
| `reason` | TEXT | 点踩原因 |
| `user_id` | TEXT | 用户ID |
| `created_at` | TIMESTAMP | 创建时间 |
**索引**
- `idx_feedback_session(session_id)`
- `idx_feedback_rating(rating)`
- `idx_feedback_created(created_at)`
### 1.2 faqs 表 - FAQ表
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | INTEGER | 自增主键 |
| `question` | TEXT | 问题 |
| `answer` | TEXT | 答案 |
| `source_documents` | TEXT | 来源文档JSON数组 |
| `frequency` | INTEGER | 出现频次 |
| `avg_rating` | REAL | 平均评分 |
| `status` | TEXT | 状态draft / approved / disabled |
| `created_at` | TIMESTAMP | 创建时间 |
| `updated_at` | TIMESTAMP | 更新时间 |
**索引**
- `idx_faq_status(status)`
### 1.3 faq_variants 表 - FAQ 问题变体表
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | INTEGER | 自增主键 |
| `faq_id` | INTEGER | 关联 FAQ ID |
| `variant_question` | TEXT | 变体问题 |
| `created_at` | TIMESTAMP | 创建时间 |
**索引**
- `idx_faq_variant_faq(faq_id)`
**外键**
- `faq_id` → faqs(id) ON DELETE CASCADE
**作用**Multi-Query Indexing为同一 FAQ 存储多种问法变体,提升语义召回率。
### 1.4 quality_reports 表 - 质量报告表
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | INTEGER | 自增主键 |
| `report_type` | TEXT | 报告类型weekly / monthly |
| `start_date` | DATE | 统计开始日期 |
| `end_date` | DATE | 统计结束日期 |
| `total_queries` | INTEGER | 总查询数 |
| `total_feedback` | INTEGER | 总反馈数 |
| `positive_count` | INTEGER | 正面反馈数 |
| `negative_count` | INTEGER | 负面反馈数 |
| `avg_rating` | REAL | 平均评分 |
| `satisfaction_rate` | REAL | 满意度 |
| `high_freq_queries` | TEXT | 高频问题JSON |
| `low_rating_queries` | TEXT | 低分问题JSON |
| `improvement_suggestions` | TEXT | 改进建议JSON |
| `created_at` | TIMESTAMP | 创建时间 |
### 1.5 faq_suggestions 表 - FAQ建议表
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | INTEGER | 自增主键 |
| `query` | TEXT | 用户问题 |
| `answer` | TEXT | 系统回答 |
| `frequency` | INTEGER | 出现频次 |
| `avg_rating` | REAL | 平均评分 |
| `status` | TEXT | 状态pending / approved / rejected |
| `created_at` | TIMESTAMP | 创建时间 |
**作用**高频优质问题自动建议沉淀为FAQ管理员审核后生效。
---
## 2. session.db - 会话管理数据库
**存储路径**`data/dev/session.db`
**环境**:仅开发模式
**所属模块**`services/session.py`
### 2.1 sessions 表 - 会话表
| 字段 | 类型 | 说明 |
|------|------|------|
| `session_id` | TEXT | 会话IDUUID主键 |
| `user_id` | TEXT | 所属用户ID |
| `created_at` | TIMESTAMP | 创建时间 |
| `last_active` | TIMESTAMP | 最后活跃时间 |
| `metadata` | TEXT | 元数据JSON格式 |
**索引**
- `idx_sessions_user(user_id)`
**作用**:实现多用户会话隔离,支持多轮对话记忆。
### 2.2 messages 表 - 消息历史表
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | INTEGER | 自增主键 |
| `session_id` | TEXT | 关联会话ID |
| `role` | TEXT | 角色user / assistant |
| `content` | TEXT | 消息内容 |
| `metadata` | TEXT | 元数据JSON格式 |
| `created_at` | TIMESTAMP | 创建时间 |
**索引**
- `idx_messages_session(session_id, created_at)`
**外键**
- `session_id` → sessions(session_id) ON DELETE CASCADE
### 2.3 audit_logs 表 - 审计日志表
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | INTEGER | 自增主键 |
| `user_id` | TEXT | 用户ID |
| `username` | TEXT | 用户名 |
| `action` | TEXT | 操作类型chat/rag/search/upload_document等 |
| `query` | TEXT | 用户查询内容 |
| `result_summary` | TEXT | 结果摘要 |
| `sources` | TEXT | 来源文档JSON数组 |
| `role` | TEXT | 用户角色 |
| `department` | TEXT | 用户部门 |
| `ip_address` | TEXT | 客户端IP |
| `duration_ms` | INTEGER | 处理耗时(毫秒) |
| `created_at` | TIMESTAMP | 创建时间 |
**索引**
- `idx_audit_user(user_id, created_at)`
- `idx_audit_action(action, created_at)`
- `idx_audit_created(created_at)`
**作用**:记录所有用户操作,用于安全审计和行为分析。
---
## 3. knowledge.db - 知识管理数据库
**存储路径**`data/prod/knowledge.db`
**环境**:生产 + 开发(始终启用)
**所属模块**`knowledge/sync.py``services/outline.py`
### 3.1 document_hashes 表 - 文档哈希表
| 字段 | 类型 | 说明 |
|------|------|------|
| `document_id` | TEXT | 文档ID相对路径主键 |
| `document_name` | TEXT | 文件名 |
| `content_hash` | TEXT | 文档内容MD5哈希 |
| `file_size` | INTEGER | 文件大小(字节) |
| `last_modified` | TIMESTAMP | 最后修改时间 |
| `created_at` | TIMESTAMP | 创建时间 |
| `updated_at` | TIMESTAMP | 更新时间 |
**作用**:记录每个文档的当前状态,用于检测变更。
### 3.2 change_logs 表 - 变更日志表
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | INTEGER | 自增主键 |
| `document_id` | TEXT | 文档ID |
| `document_name` | TEXT | 文件名 |
| `change_type` | TEXT | 变更类型added / modified / deleted |
| `old_hash` | TEXT | 变更前哈希 |
| `new_hash` | TEXT | 变更后哈希 |
| `change_time` | TIMESTAMP | 变更时间 |
| `processed` | INTEGER | 是否已处理0/1 |
| `error_message` | TEXT | 错误信息 |
| `created_at` | TIMESTAMP | 创建时间 |
**索引**
- `idx_change_logs_time(change_time)`
- `idx_change_logs_processed(processed)`
### 3.3 sync_status 表 - 同步状态表
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | INTEGER | 自增主键 |
| `sync_type` | TEXT | 同步类型incremental/full |
| `status` | TEXT | 状态idle / running / completed / failed |
| `start_time` | TIMESTAMP | 开始时间 |
| `end_time` | TIMESTAMP | 结束时间 |
| `documents_processed` | INTEGER | 处理文档数 |
| `documents_added` | INTEGER | 新增文档数 |
| `documents_modified` | INTEGER | 修改文档数 |
| `documents_deleted` | INTEGER | 删除文档数 |
| `error_message` | TEXT | 错误信息 |
| `created_at` | TIMESTAMP | 创建时间 |
### 3.4 outline_cache 表 - 纲要缓存表
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | INTEGER | 自增主键 |
| `document_id` | TEXT | 文档ID唯一 |
| `document_name` | TEXT | 文档名称 |
| `total_pages` | INTEGER | 总页数 |
| `content_hash` | TEXT | 文档内容哈希 |
| `outline_json` | TEXT | 纲要结构JSON |
| `generated_at` | TIMESTAMP | 生成时间 |
**索引**
- `idx_outline_doc(document_id)`
### 3.5 document_vectors 表 - 文档向量缓存表
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | INTEGER | 自增主键 |
| `document_id` | TEXT | 文档ID唯一 |
| `document_name` | TEXT | 文档名称 |
| `vector_hash` | TEXT | 向量哈希 |
| `vector_json` | TEXT | 向量数据JSON |
| `tags_json` | TEXT | 标签JSON |
| `updated_at` | TIMESTAMP | 更新时间 |
**索引**
- `idx_vector_doc(document_id)`
### 3.6 recommendation_cache 表 - 推荐缓存表
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | INTEGER | 自增主键 |
| `document_id` | TEXT | 文档ID |
| `recommendations_json` | TEXT | 推荐结果JSON |
| `generated_at` | TIMESTAMP | 生成时间 |
### 3.7 document_versions 表 - 文档版本表
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | INTEGER | 自增主键 |
| `document_id` | TEXT | 文档ID |
| `collection` | TEXT | 所属向量库 |
| `version` | TEXT | 版本号,默认 'v1' |
| `content_hash` | TEXT | 内容哈希 |
| `status` | TEXT | 状态active / deprecated |
| `effective_date` | DATE | 生效日期 |
| `expiry_date` | DATE | 失效日期 |
| `deprecated_date` | DATETIME | 废止日期 |
| `deprecated_reason` | TEXT | 废止原因 |
| `deprecated_by` | TEXT | 废止操作人 |
| `change_summary` | TEXT | 变更摘要 |
| `changed_sections` | TEXT | 变更章节JSON |
| `supersedes` | TEXT | 取代的版本 |
| `chunk_count` | INTEGER | 片段数量 |
| `created_at` | TIMESTAMP | 创建时间 |
| `created_by` | TEXT | 创建人 |
**唯一约束**`(document_id, collection, version)`
### 3.8 version_change_logs 表 - 版本变更日志表
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | INTEGER | 自增主键 |
| `document_id` | TEXT | 文档ID |
| `collection` | TEXT | 所属向量库 |
| `old_version` | TEXT | 旧版本 |
| `new_version` | TEXT | 新版本 |
| `old_status` | TEXT | 旧状态 |
| `new_status` | TEXT | 新状态 |
| `change_type` | TEXT | 变更类型 |
| `reason` | TEXT | 原因 |
| `changed_by` | TEXT | 操作人 |
| `created_at` | TIMESTAMP | 创建时间 |
---
## 4. exam.db - 出题系统数据库
**存储路径**`data/dev/exam.db`
**环境**:仅开发模式
**所属模块**`exam_pkg/manager.py``exam_pkg/local_db.py``exam_pkg/analysis.py`
### 4.1 questions 表 - 题目表
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | TEXT | 题目IDUUID主键 |
| `question_type` | TEXT | 题型choice / blank / short_answer |
| `content` | TEXT | 题干内容 |
| `options` | TEXT | 选择题选项JSON数组 |
| `correct_answer` | TEXT | 正确答案 |
| `analysis` | TEXT | 解析 |
| `knowledge_points` | TEXT | 知识点JSON数组 |
| `difficulty` | INTEGER | 难度(1-5) |
| `score` | INTEGER | 分值 |
| `source_file` | TEXT | 来源文件路径 |
| `source_collection` | TEXT | 来源向量库 |
| `source_snippet` | TEXT | 来源知识片段 |
| `source_hash` | TEXT | 文件哈希 |
| `status` | TEXT | 状态approved |
| `created_at` | TIMESTAMP | 创建时间 |
| `created_by` | TEXT | 创建人 |
| `updated_at` | TIMESTAMP | 更新时间 |
**索引**
- `idx_questions_source(source_file)`
### 4.2 exams 表 - 试卷表
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | TEXT | 试卷ID主键 |
| `name` | TEXT | 试卷名称 |
| `description` | TEXT | 描述 |
| `total_score` | INTEGER | 总分 |
| `total_count` | INTEGER | 题目总数 |
| `duration` | INTEGER | 考试时长(分钟) |
| `status` | TEXT | 状态published |
| `created_at` | TIMESTAMP | 创建时间 |
| `created_by` | TEXT | 创建人 |
### 4.3 exam_questions 表 - 试卷题目关联表
| 字段 | 类型 | 说明 |
|------|------|------|
| `exam_id` | TEXT | 试卷ID |
| `question_id` | TEXT | 题目ID |
| `question_order` | INTEGER | 题目顺序 |
**主键**`(exam_id, question_id)`
**外键**
- `exam_id` → exams(id) ON DELETE CASCADE
- `question_id` → questions(id) ON DELETE CASCADE
### 4.4 student_answers 表 - 学生答卷表
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | TEXT | 主键 |
| `exam_id` | TEXT | 试卷ID |
| `student_id` | TEXT | 学生ID |
| `question_id` | TEXT | 题目ID |
| `question_type` | TEXT | 题型 |
| `student_answer` | TEXT | 学生答案 |
| `score` | REAL | 得分 |
| `max_score` | INTEGER | 满分 |
| `feedback` | TEXT | 反馈 |
| `score_details` | TEXT | 评分详情JSON |
| `submitted_at` | TIMESTAMP | 提交时间 |
| `graded_at` | TIMESTAMP | 批阅时间 |
**索引**
- `idx_student_answers_exam(exam_id, student_id)`
### 4.5 grade_reports 表 - 批阅报告表
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | TEXT | 主键 |
| `exam_id` | TEXT | 试卷ID |
| `student_id` | TEXT | 学生ID |
| `total_score` | REAL | 总得分 |
| `max_score` | REAL | 满分 |
| `score_rate` | REAL | 得分率 |
| `analysis` | TEXT | 分析JSON |
| `graded_at` | TIMESTAMP | 批阅时间 |
### 4.6 question_document_links 表 - 题目-制度关联表
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | INTEGER | 自增主键 |
| `question_id` | TEXT | 题目ID |
| `question_type` | TEXT | 题型 |
| `exam_id` | TEXT | 试卷ID |
| `document_id` | TEXT | 制度文档ID |
| `document_name` | TEXT | 制度文档名称 |
| `chapter` | TEXT | 章节 |
| `key_points` | TEXT | 关键知识点JSON |
| `relevance_score` | REAL | 相关度分数 |
| `created_at` | TIMESTAMP | 创建时间 |
**索引**
- `idx_qdl_question(question_id)`
- `idx_qdl_document(document_id)`
### 4.7 knowledge_points 表 - 知识点表
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | INTEGER | 自增主键 |
| `name` | TEXT | 知识点名称,唯一 |
| `category` | TEXT | 分类 |
| `description` | TEXT | 描述 |
| `parent_id` | INTEGER | 父知识点ID |
| `created_at` | TIMESTAMP | 创建时间 |
**外键**
- `parent_id` → knowledge_points(id)
### 4.8 question_knowledge_links 表 - 题目-知识点关联表
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | INTEGER | 自增主键 |
| `question_id` | TEXT | 题目ID |
| `question_type` | TEXT | 题型 |
| `exam_id` | TEXT | 试卷ID |
| `knowledge_point_id` | INTEGER | 知识点ID |
| `knowledge_point_name` | TEXT | 知识点名称 |
| `weight` | REAL | 权重 |
| `created_at` | TIMESTAMP | 创建时间 |
**索引**
- `idx_qkl_question(question_id)`
- `idx_qkl_knowledge(knowledge_point_id)`
### 4.9 question_status 表 - 题目状态表
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | INTEGER | 自增主键 |
| `question_id` | TEXT | 题目ID唯一 |
| `question_type` | TEXT | 题型 |
| `exam_id` | TEXT | 试卷ID |
| `status` | TEXT | 状态 |
| `affected_by` | TEXT | 影响来源 |
| `affect_reason` | TEXT | 影响原因 |
| `updated_at` | TIMESTAMP | 更新时间 |
**索引**
- `idx_qs_status(status)`
### 4.10 exam_analysis_reports 表 - 整卷分析报告表
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | INTEGER | 自增主键 |
| `report_id` | TEXT | 报告ID唯一 |
| `exam_id` | TEXT | 试卷ID |
| `exam_name` | TEXT | 试卷名称 |
| `student_id` | TEXT | 学生ID |
| `total_score` | REAL | 总得分 |
| `max_score` | REAL | 满分 |
| `score_rate` | REAL | 得分率 |
| `type_scores` | TEXT | 各题型得分JSON |
| `knowledge_analysis` | TEXT | 知识点分析JSON |
| `weak_points` | TEXT | 薄弱知识点JSON |
| `strong_points` | TEXT | 优势知识点JSON |
| `ai_comment` | TEXT | AI评语 |
| `study_suggestions` | TEXT | 学习建议JSON |
| `created_at` | TIMESTAMP | 创建时间 |
### 4.11 question_suggestions 表 - 新题建议表
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | INTEGER | 自增主键 |
| `document_id` | TEXT | 文档ID |
| `suggestion` | TEXT | 建议内容 |
| `status` | TEXT | 状态pending |
| `created_at` | TIMESTAMP | 创建时间 |
---
## 5. ChromaDB 向量数据库
**所属模块**`knowledge/manager.py`
### 5.1 向量库结构
```
knowledge/vector_store/chroma/
├── chroma.sqlite3 # ChromaDB 主数据库
├── kb_metadata.json # 向量库元数据
├── public_kb/ # 公开知识库
├── dept_finance/ # 财务部知识库
├── dept_hr/ # 人事部知识库
├── dept_tech/ # 技术部知识库
└── ... # 其他部门向量库
```
### 5.2 权限矩阵
| 角色 | 可访问向量库 | 可上传 | 可删除 | 可同步 |
|------|------------|--------|--------|--------|
| admin | 全部 | 全部 | 全部 | 全部 |
| manager | public_kb + 本部门 | 本部门 | 本部门 | 本部门 |
| user | public_kb + 本部门 | - | - | - |
### 5.3 文档元数据结构
每个文档 chunk 的元数据:
| 字段 | 类型 | 说明 |
|------|------|------|
| `source` | TEXT | 文档来源文件名 |
| `page` | INTEGER | PDF 页码(可选) |
| `sheet` | TEXT | Excel 工作表(可选) |
| `row` | INTEGER | Excel 行号(可选) |
| `section` | TEXT | 章节(可选) |
| `is_table` | BOOLEAN | 是否为表格 |
| `is_excel` | BOOLEAN | 是否为 Excel 数据 |
| `security_level` | TEXT | 安全级别 |
| `collection` | TEXT | 所属向量库名称 |
---
## 数据库关系图
```
┌─────────────────────────────────────────────────────────────────┐
│ 多向量库架构 │
├─────────────────────────────────────────────────────────────────┤
│ knowledge/vector_store/chroma/ │
│ ├── public_kb/ │
│ ├── dept_finance/ │
│ ├── dept_hr/ │
│ └── ... │
│ │
│ knowledge/manager.py ─────────────────────────────────────┐ │
│ knowledge/router.py │ │
└─────────────────────────────────────────────────────────────┼───┘
user_id / document_id 关联 │
┌──────────────────┐ ┌──────────────────┐
│ data/prod/ │ │ data/prod/ │
│ feedback.db │ │ knowledge.db │
│ (生产+开发) │ │ (生产+开发) │
│ │ │ │
│ • feedbacks │ │ • document_ │
│ • faqs │ │ hashes │
│ • faq_variants │ │ • change_logs │
│ • quality_ │ │ • sync_status │
│ reports │ │ • outline_cache │
│ • faq_ │ │ • document_ │
│ suggestions │ │ versions │
└──────────────────┘ └──────────────────┘
┌──────────────────┐ ┌──────────────────┐
│ data/dev/ │ │ data/dev/ │
│ session.db │ │ exam.db │
│ (仅开发) │ │ (仅开发) │
│ │ │ │
│ • sessions │ │ • questions │
│ • messages │ │ • exams │
│ • audit_logs │ │ • student_ │
│ │ │ answers │
│ │ │ • grade_reports │
│ │ │ • knowledge_ │
│ │ │ points │
└──────────────────┘ └──────────────────┘
```
---
## 数据库维护
### 数据清理
```bash
# 清理过期会话24小时未活跃- 仅开发环境
sqlite3 data/dev/session.db "DELETE FROM sessions WHERE last_active < datetime('now', '-24 hours');"
sqlite3 data/dev/session.db "DELETE FROM messages WHERE session_id NOT IN (SELECT session_id FROM sessions);"
# 清理旧审计日志保留30天- 仅开发环境
sqlite3 data/dev/session.db "DELETE FROM audit_logs WHERE created_at < datetime('now', '-30 days');"
```
### 数据备份
```bash
# 备份所有 SQLite 数据库
cp data/prod/*.db backup/
cp data/dev/*.db backup/
# 使用 SQLite 在线备份
sqlite3 data/prod/feedback.db ".backup backup/feedback_backup.db"
sqlite3 data/prod/knowledge.db ".backup backup/knowledge_backup.db"
```
### 重置数据库
删除对应的文件,服务启动时会自动重建表结构:
```bash
# 重置反馈数据(会丢失反馈和 FAQ
rm data/prod/feedback.db
# 重置知识管理数据(会丢失文档追踪和版本)
rm data/prod/knowledge.db
# 重置会话数据(会丢失会话和对话历史)- 仅开发环境
rm data/dev/session.db
# 重置出题系统数据(会丢失题目和试卷)- 仅开发环境
rm data/dev/exam.db
```
---
## 更新日志
| 日期 | 版本 | 更新内容 |
|------|------|----------|
| 2026-06-04 | 4.0 | 修正为 4 库分离架构rag_core.db 拆分为 feedback.db + session.db按 prod/dev 子目录分离;新增 faq_variants 表;移除已废弃的 subscriptions/notifications 表 |
| 2026-04-13 | 3.0 | 数据库架构重构6 个独立数据库合并为 3 个 |
| 2026-04-09 | 2.0 | 新增多向量库架构文档 |
| 2026-04-07 | 1.0 | 初始版本 |