AI面试平台数据库架构设计详解

📅 2026/7/8 20:44:29 👁️ 阅读次数 📝 编程学习
AI面试平台数据库架构设计详解

一、需求背景

  • 为 AI 面试平台设计初版数据库方案
  • 后续会根据业务迭代持续调整,属于演进式设计
  • 按微服务边界拆分,逻辑分库,便于各服务独立演进

二、数据库关系图(四大业务体系)

体系间核心关联

关联说明
商品体系 → 用户体系package_benefit关联account_benefit,套餐权益下发到用户
面试体系 → 商品体系interview消耗benefit权益
用户体系 → 面试体系account发起面试,关联resumeinterview

三、微服务数据库拆分

数据库所属服务核心表
account_db账号服务account、account_benefit、benefit_task、benefit_usage_log
product_db商品服务benefit、product_package、package_benefit、product_order、banner
ai_dbAI 面试服务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_dbaccount用户账户表
account_dbaccount_benefit用户权益表
account_dbbenefit_task权益任务表
account_dbbenefit_usage_log权益使用流水
product_dbbenefit权益基础信息表
product_dbproduct_package商品套餐表
product_dbpackage_benefit套餐权益关联表
product_dbproduct_order商品订单表
product_dbbanner轮播图表
ai_dbinterview面试主表
ai_dbinterview_round面试轮次表
ai_dbquestion题目表
ai_dbai_chat_recordAI 对话记录表
ai_dbresume简历表