# AR03 — 数据库架构设计 > **版本:V2.0 | 引擎:SQLite(modernc 纯Go驱动)** > **完整建表 SQL 请见 docs/db_schema.md** --- ## 1. ER 关系总图 ``` user ──< media_file (submitter_id / audit_by) user ──< exam_record (user_id) product ──< course (related_product_id) course ──< question (course_id, optional) media_file ──< knowledge_chunk (media_file_id) exam_paper ──< exam_record (paper_id) ``` ## 2. 表清单 | # | 表名 | 说明 | 核心字段数 | |---|------|------|-----------| | 1 | `user` | 用户账号 | 7 | | 2 | `product` | 产品信息 | 16 | | 3 | `course` | 课程内容 | 16 | | 4 | `media_file` | 素材文件元数据 | 16 | | 5 | `knowledge_chunk` | AI 知识库文本块 | 6 | | 6 | `question` | 题库题目 | 11 | | 7 | `exam_paper` | 考试配置/组卷 | 11 | | 8 | `exam_record` | 考试记录档案 | 12 | | 9 | `system_config` | 系统参数配置 | 4 | ## 3. 索引策略 | 表 | 索引 | 类型 | 说明 | |----|------|------|------| | `user` | `role`, `status` | BTREE | 角色筛选、状态筛选 | | `product` | `category`, `status` | BTREE | 分类筛选、状态筛选 | | `course` | `category`, `status`, `related_product_id` | BTREE | 同上 | | `media_file` | `status`, `submitter_id`, `(bind_type, bind_id)`, `extracted` | BTREE | 审批列表、绑定查询、提取状态 | | `knowledge_chunk` | `media_file_id` | BTREE | 关联查询 | | `question` | `domain`, `course_id`, `status` | BTREE | 知识域筛选、课程筛选 | | `exam_paper` | `type`, `status` | BTREE | 考试类型筛选 | | `exam_record` | `user_id`, `paper_id`, `passed`, `submitted_at` | BTREE | 用户查记录、管理员查全部 | | `system_config` | `config_key` | UNIQUE | 键查值 | ## 4. AI 知识检索说明 Go 内 brute-force 余弦向量检索(Ollama bge-m3 embedding)+ 关键词兜底: ```sql -- SQLite 原生,无全文索引,向量检索在 Go 层实现 -- knowledge_chunk.content 字段存储文本,向量计算由 Go net/http 调用 Ollama ``` **检索流程(当前):** 1. 用户提问 → embedding 向量(bge-m3) 2. Go 遍历 knowledge_chunk.content 计算余弦距离(数据量小无需 ANN) 3. 匹配段落作为上下文注入 LLM Prompt 4. LLM 基于上下文生成回答 ## 5. 文件存储策略 - **数据库只存元数据**,不存文件二进制 - 物理文件存储在 `data/media/` - 目录结构: ``` data/media/ ├── upload/ # 上传文件存储(UUID 重命名) └── _preview_cache/ # 预览缓存(LibreOffice 转 PDF 后存放) ``` - 文件命名:UUID 重命名,杜绝路径穿越 - 文件扩展名白名单:ppt / pptx / pdf / doc / docx / mp4 / png / jpg / jpeg