声明:本AI应用开发系列教程首发在同名公众号:王中阳,未经授权禁止转载。
Go-Eino 面试 Agent 平台采用结构良好的关系数据库模式,使用 GORM 作为 ORM 框架。该设计遵循以用户为中心的方法,在不同功能域之间实现明确的关注点分离。
核心实体关系
用户管理模式
user 表作为系统的核心实体,支持传统身份验证和微信集成:user.go
核心功能:
- 双重身份验证:支持用户名/邮箱登录以及微信 OpenID/UnionID 集成
- 基于角色的访问控制:实现基于角色的权限管理,默认角色为 'user'
- 软删除:利用 GORM 的
DeletedAt进行逻辑删除 - 唯一约束:对用户名、邮箱和微信标识符强制唯一性
索引策略:
id上的主键username、email、wechat_open_id、wechat_union_id上的唯一索引- 用于高效身份验证查询的复合索引
简历管理系统
resume 表处理用户文档存储,具备版本控制功能:resume.go
存储架构:
- 内容存储:使用
longtext实现灵活的文档内容存储 - 元数据跟踪:维护文件信息(名称、大小、类型)以便正确处理
- 默认选择:实现
is_default标志用于主简历标识 - 软删除:使用
deleted标志进行逻辑删除并保留数据
查询优化:
- 为
user_id建立索引以高效检索用户特定简历 - 为
deleted建立索引以过滤活跃记录 - 为
is_default建立索引以优化主简历查找
面试会话管理
面试系统采用多表方法进行全面会话跟踪:
面试记录表
interview_record.go 存储会话元数据:
会话属性:
- 分类:类型、难度和领域分类
- 上下文:公司和职位信息用于定向面试
- 生命周期:状态跟踪(待定/已完成)及持续时间测量
- 时间:自动时间戳管理用于审计跟踪
面试对话表
interview_dialogue.go 捕获对话流:
对话存储:
- 顺序存储:按时间顺序维护问答对
- 用户关联:将对话链接到特定用户和面试会话
- 文本内容:使用
text类型支持无限内容长度 - 复合索引:针对用户+报告查询进行优化
面试评估系统
interview_evaluation.go 实现多维度评估:
评估架构:
- JSON 序列化:使用 GORM 的 JSON 序列化器存储复杂的维度数据
- 可扩展维度:灵活的
EvaluationDimension结构支持多种评估标准 - 精确评分:使用
decimal(5,2)实现准确的分数表示 - 软删除:通过逻辑删除维护评估历史
答案报告系统
answer_report.go 提供详细的答案分析:
报告结构:
- 分层数据:用于复杂答案记录的嵌套 JSON 结构
- 全面反馈:包括优势、劣势和建议的多方面评估
- 消息历史:在答案上下文中完整保存对话
- 模块化评论:用于详细答案分析的结构化评论系统
预测系统模式
预测功能实现题库系统:prediction.go
题目管理:
- 记录组织:预测记录对相关题目进行分组
- 题目元数据:跟踪题目顺序和内容
- 用户关联:将预测链接到用户账户
- 可扩展设计:支持批量题目创建和检索
数据库设计模式
索引策略
模式采用策略性索引优化性能:
| 表 | 主索引 | 次索引 | 目的 |
|---|---|---|---|
| user | id | username, email, wechat_open_id, wechat_union_id | 身份验证和查找 |
| resume | id | user_id, deleted | 用户查询和过滤 |
| interview_record | id | user_id | 会话检索 |
| interview_dialogue | id | user_id, report_id | 对话查询 |
| interview_evaluation | id | user_id, report_id, deleted | 评估查找 |
| answer_report | id | user_id, report_id, deleted | 报告访问 |
数据类型优化
- 文本存储:使用
longtext存储可变长度内容(简历、答案) - 精确数字:采用
decimal(5,2)实现准确评分 - 时间戳处理:为 created/updated 字段自动处理毫秒精度
- 布尔标志:使用整数表示状态和删除标志
软删除实现
多个表实现逻辑删除:
- GORM 集成:利用
gorm.DeletedAt自动软删除 - 自定义标志:在 GORM 软删除不适用的场景使用整数
deleted标志 - 查询过滤:在标准查询中自动排除已删除记录
事务管理
系统包含事务支持以确保数据一致性:transaction.go 为涉及多表的复杂操作提供事务工具,确保相关数据修改的 ACID 属性。
模式设计通过策略性索引优先考虑查询性能,同时通过外键关系和软删除模式维护数据完整性。这种方法在可扩展性与数据保留需求之间取得平衡。
对复杂嵌套结构(评估、答案报告)使用 JSON 序列化,既提供了灵活性,又保持了关系数据库在核心实体关系和索引方面的优势。
一起进步
欢迎关注我,如果你也对Ai应用开发感兴趣,可以再掘金私信我。