shape

Dodam - 实现项目制深夜自习申请功能

概述

扩展 Dodam 的深夜自习功能并优化查询

技术栈

  • Java

    Java

  • Spring Boot

    Spring Boot

  • Spring JPA

    Spring JPA

  • MySQL

    MySQL

  • Redis

    Redis

  • Docker Compose

    Docker Compose

  • AWS

    AWS

  • GitHub Actions

    GitHub Actions

  • Git

    Git

团队

9 人(后端 2 人、Web 3 人、Android 2 人、iOS 2 人)

期间

2025.04 ~ 2025.05

相关链接

实现代码网页服务

详细内容

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