詳細內容
- 我的貢獻
- 實作了以專案為單位的深夜自習申請。學生輸入日期、時間與專案內容,選擇組員後即可提出申請。
- 在學生提出申請,或教師變更狀態(核准/駁回)時,必須一併更新包含專案負責人在內的所有參與者的申請狀態。
- 初期資料表結構
- 個人深夜自習申請功能原本就已存在。開發 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 等)。
- 重構前
- 重構後