详细内容
- 我的贡献
- 实现了以项目为单位的深夜自习申请。学生填写日期、时间和项目内容,选择组员后进行申请。
- 在学生提交申请、教师变更状态(接受/拒绝)时,需要一并更新包括项目负责人在内的所有参与者的申请状态。
- 初期表结构
- 此前已存在个人深夜自习申请功能。在开发 MVP 时,我们复用了原有的通用深夜自习表,并另外创建了一张项目表,通过外键(FK)接收并存储项目 ID。
- 问题
- 查询项目时会产生多余的 WHERE 子句。JPA 在查找深夜自习记录时,必须依据 project_id 是否存在来区分深夜自习的类型,导致每次请求都会附加不必要的 WHERE 条件。
- 频繁使用循环以及产生大量 SQL 查询,引发了 JPA 的 N+1 问题和过高的时间复杂度。
- 改进后的表结构
- 将其规范化为 night_study、night_study_project、night_study_project_member 三张表。
- 相比使用循环,改为在 JPA 与 JPQL 中运用 IN、JOIN、EXISTS 等,从而降低了时间复杂度。
- 成果
- 将响应时间从 POST 请求平均 320ms 缩短至 87ms,PATCH 请求从 624ms 缩短至 49ms。
- 查询项目时不再产生多余的查询(JOIN、WHERE 等)。
- 重构前
- 重构后