AI面试平台数据库架构设计详解
📅 2026/7/8 20:44:29
👁️ 阅读次数
📝 编程学习
一、需求背景
- 为 AI 面试平台设计初版数据库方案
- 后续会根据业务迭代持续调整,属于演进式设计
- 按微服务边界拆分,逻辑分库,便于各服务独立演进
二、数据库关系图(四大业务体系)
体系间核心关联
| 关联 | 说明 |
|---|---|
| 商品体系 → 用户体系 | package_benefit关联account_benefit,套餐权益下发到用户 |
| 面试体系 → 商品体系 | interview消耗benefit权益 |
| 用户体系 → 面试体系 | account发起面试,关联resume和interview |
三、微服务数据库拆分
| 数据库 | 所属服务 | 核心表 |
|---|---|---|
account_db | 账号服务 | account、account_benefit、benefit_task、benefit_usage_log |
product_db | 商品服务 | benefit、product_package、package_benefit、product_order、banner |
ai_db | AI 面试服务 | interview、interview_round、question、ai_chat_record、resume |
四、SQL 脚本下载
五、账号服务核心表设计(account_db)
5.1 account(用户账户表)
- 支持多种登录方式:手机号、微信等
- 用户角色:
普通用户/ADMIN 管理员
5.2 account_benefit(用户权益表)
- 记录用户拥有的各类权益(面试次数、简历分析次数等)
- 支持权益过期时间、剩余次数管理
- 通过
benefit_code区分不同权益类型
5.3 benefit_task(权益任务表)
- 记录「当前权益扣减 + 业务 ID」的事务
- 配合延迟队列实现超时补偿(任务失败/超时时退还权益次数)
5.4 benefit_usage_log(权益使用流水表)
- 记录每次权益使用的详细日志
- 支持业务追溯与数据统计
- 为权益消耗分析提供数据支撑
benefit_usage_log 表结构:
CREATE TABLE `benefit_usage_log` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ID', `account_id` bigint NOT NULL COMMENT '用户账号ID(关联account表id)', `biz_id` bigint NOT NULL COMMENT '使用权益ID(关联interview、resume表id)', `benefit_code` varchar(64) NOT NULL COMMENT '权益编码', `account_benefit` bigint NOT NULL COMMENT '用户权益ID(关联account_benefit表id)', `usage_time` datetime NOT NULL COMMENT '使用时间', `remark` varchar(500) DEFAULT NULL COMMENT '使用备注', `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB COMMENT='权益使用日志表';六、商品服务核心表设计(product_db)
6.1 benefit(权益基础信息表)
- 定义系统中所有可购买的权益类型
- 包含价格、有效期等商品属性
- 支持「热门」「推荐」等标签
6.2 product_package(商品套餐表)
- 展示商品套餐相关信息
6.3 package_benefit(套餐权益关联表)
- 套餐与权益的多对多关系
- 定义每个套餐包含哪些权益及对应使用次数
6.4 product_order(商品订单表)
- 支持两种模式:购买套餐 / 单独购买权益
- 完整的订单状态流转逻辑
- 支付信息记录,支持优惠与多种支付方式
6.5 banner(轮播图表)
- 暂放在 product-service 下简化处理
- 后续可独立 CMS / 运营后台服务
七、AI 面试服务核心表设计(ai_db)
7.1 interview(面试主表)
CREATE TABLE `interview` ( `id` bigint NOT NULL AUTO_INCREMENT, `title` varchar(255) DEFAULT NULL COMMENT '面试标题', `description` varchar(1024) DEFAULT NULL COMMENT '描述', `type` varchar(255) DEFAULT NULL COMMENT '面试类型:专项面、深度面、简历普通面', `extend_content` varchar(1024) DEFAULT NULL COMMENT '拓展字段', `profile` varchar(524) DEFAULT NULL COMMENT '用户求职画像', `average_score` decimal(16,2) DEFAULT NULL COMMENT '平均分', `account_id` bigint DEFAULT NULL COMMENT '账号ID', `resume_id` bigint DEFAULT NULL COMMENT '简历ID', `status` varchar(64) DEFAULT NULL COMMENT '面试状态:GENERATING、IN_PROGRESS、EVALUATING', `overall_score` decimal(16,2) DEFAULT NULL COMMENT '总体评分(0-100分)', `summary` varchar(2048) DEFAULT NULL COMMENT '面试总结和评价', `strength` varchar(1024) DEFAULT NULL COMMENT '优势分析', `improvement` varchar(1024) DEFAULT NULL COMMENT '需要改进的地方', `suggestion` varchar(1024) DEFAULT NULL COMMENT '具体建议', `technical_skills` decimal(16,2) DEFAULT NULL COMMENT '技术能力评分', `logical_thinking` decimal(16,2) DEFAULT NULL COMMENT '逻辑思维评分', `communication` decimal(16,2) DEFAULT NULL COMMENT '表达能力评分', `problem_solving` decimal(16,2) DEFAULT NULL COMMENT '解决问题能力评分', `passed_question` int DEFAULT NULL COMMENT '及格题目数(>=60分)', `excellent_question` int DEFAULT NULL COMMENT '优秀题目数(>=80分)', `gmt_create` datetime DEFAULT CURRENT_TIMESTAMP, `gmt_modified` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;面试状态流转:
GENERATING(生成中) → IN_PROGRESS(进行中) → EVALUATING(评估中) → 完成
7.2 interview_round(面试轮次表)
- 记录每轮面试信息
- 关联
interview_id,通过round_number标识第几轮
7.3 question(题目表)
CREATE TABLE `question` ( `id` bigint NOT NULL AUTO_INCREMENT, `interview_id` bigint DEFAULT NULL COMMENT '面试ID', `account_id` bigint DEFAULT NULL, `interview_round_id` bigint DEFAULT NULL COMMENT '轮次ID', `status` varchar(255) DEFAULT NULL COMMENT '状态', `user_answer` varchar(2048) DEFAULT NULL COMMENT '用户答案', `evaluation` varchar(4096) DEFAULT NULL COMMENT '题目点评', `content` varchar(2048) DEFAULT NULL COMMENT '题目内容', `type` varchar(255) DEFAULT NULL COMMENT 'CODING, SHORT_ANSWER', `difficulty` varchar(255) DEFAULT NULL COMMENT 'BEGINNER, INTERMEDIATE, ADVANCED', `category` varchar(255) DEFAULT NULL COMMENT '题目分类(Java基础、Spring框架、数据库等)', `standard_answer` varchar(2048) DEFAULT NULL COMMENT '标准答案', `key_points` varchar(510) DEFAULT NULL COMMENT '关键要点,JSON格式', `max_score` int DEFAULT '100' COMMENT '满分分值100', `time_limit` int DEFAULT NULL COMMENT '答题时间限制(分钟)', `user_score` int DEFAULT NULL COMMENT '回答评分', `gmt_create` datetime DEFAULT CURRENT_TIMESTAMP, `gmt_modified` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;7.4 ai_chat_record(AI 对话记录表)
CREATE TABLE `ai_chat_record` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', `account_id` bigint NOT NULL COMMENT '用户ID(租户ID)', `interview_id` bigint NOT NULL COMMENT '面试ID', `record_type` varchar(64) NOT NULL COMMENT 'METADATA-会话元信息, MESSAGE-消息内容', `role` varchar(32) DEFAULT NULL COMMENT '角色(user/assistant/system)', `content` text NOT NULL COMMENT '会话标题或消息内容', `sequence` int DEFAULT NULL COMMENT '消息序号(同会话内递增)', `gmt_create` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `status` varchar(64) DEFAULT 'ONGOING' COMMENT '会话状态(ONGOING-进行中, ENDED-已结束)', PRIMARY KEY (`id`), KEY `idx_user_session_type` (`account_id`, `interview_id`, `record_type`) ) ENGINE=InnoDB COMMENT='AI对话记录(会话+消息合并表)';设计亮点: 会话元信息与消息内容合并在一张表,通过record_type区分,减少表关联查询。
7.5 resume(简历表)
CREATE TABLE `resume` ( `id` bigint NOT NULL AUTO_INCREMENT, `account_id` bigint DEFAULT NULL, `filename` varchar(255) DEFAULT NULL, `file_path` varchar(255) DEFAULT NULL, `file_type` varchar(255) DEFAULT NULL, `content` varchar(10000) DEFAULT NULL, `skill_tags` varchar(524) DEFAULT NULL, `evaluation` varchar(5000) DEFAULT NULL COMMENT 'AI简历分析', `status` varchar(64) DEFAULT NULL COMMENT '解析状态', `gmt_create` datetime DEFAULT CURRENT_TIMESTAMP, `gmt_modified` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;八、AI 编辑器绘制 ER 图实战
8.1 实战任务
使用interview.sql数据库结构文件,让 AI 绘制 ER 图:
该 SQL 文件包含 15 张表的结构定义,包括
account(用户表)、interview(面试表)、question(问题表)、benefit(权益表)、product_order(订单表)等。请分析表之间的关联关系(外键、一对多、多对一等),以清晰的 ER 图形式展示,包含所有表字段、主键(PK)、外键(FK)及表间连线。
8.2 创建微服务数据库
CREATE DATABASE account_db DEFAULT CHARACTER SET utf8mb4; -- 账号数据库 CREATE DATABASE product_db DEFAULT CHARACTER SET utf8mb4; -- 商品数据库 CREATE DATABASE ai_db DEFAULT CHARACTER SET utf8mb4; -- AI面试数据库分别导入对应 SQL 脚本即可。
九、常见问题:Too many connections
9.1 问题原因
多个微服务连接同一 MySQL 实例,各服务连接池叠加后容易耗尽连接数,导致新连接无法建立。
9.2 排查与解决
-- 1. 查询当前允许的最大连接数 -- 建议:8核16G 服务器设置在 500~2000 之间 SHOW VARIABLES LIKE 'max_connections'; -- 2. 查看当前已打开的连接数 SHOW STATUS LIKE 'Threads_connected'; -- 3. 查看历史连接数峰值 SHOW STATUS LIKE 'Max_used_connections'; -- 4. 临时调大连接数(需结合可用内存评估) SET GLOBAL max_connections = 500;9.3 优化建议
| 方向 | 措施 |
|---|---|
| 配置调整 | 合理设置max_connections,监控连接峰值 |
| 连接池优化 | 各微服务连接池maximum-pool-size不宜过大 |
| 代码层面 | 确保连接及时释放,避免连接泄漏 |
| 架构演进 | 后续可物理分库,各服务独立 MySQL 实例 |
十、设计亮点总结
| 设计点 | 说明 |
|---|---|
| 逻辑分库 | 按微服务边界拆分三库,便于独立演进 |
| 权益体系 | benefit_task + 延迟队列实现超时补偿,保证权益扣减可靠性 |
| 流水追溯 | benefit_usage_log 全量记录,支持统计与审计 |
| 会话合并 | ai_chat_record 合并会话与消息,减少 JOIN |
| 多维评分 | interview 表支持技术/逻辑/表达/解决问题等多维度 AI 评分 |
| 演进式设计 | 初版方案,随业务迭代持续优化 |
十一、全表清单速查
| 数据库 | 表名 | 中文名 |
|---|---|---|
| account_db | account | 用户账户表 |
| account_db | account_benefit | 用户权益表 |
| account_db | benefit_task | 权益任务表 |
| account_db | benefit_usage_log | 权益使用流水 |
| product_db | benefit | 权益基础信息表 |
| product_db | product_package | 商品套餐表 |
| product_db | package_benefit | 套餐权益关联表 |
| product_db | product_order | 商品订单表 |
| product_db | banner | 轮播图表 |
| ai_db | interview | 面试主表 |
| ai_db | interview_round | 面试轮次表 |
| ai_db | question | 题目表 |
| ai_db | ai_chat_record | AI 对话记录表 |
| ai_db | resume | 简历表 |
编程学习
技术分享
实战经验