状況
ユーザごとの注文件数を返す処理の PR をレビューしている。users は数万件になる見込みだ。差分の中心は次のコード。
レビューコメントとして最も適切なのは?
for (const user of users) { const orders = await db.query('SELECT * FROM orders WHERE user_id = ?', [user.id]); result.push({ user, count: orders.length });}正答
- このループは良くないので、別の書き方に直してください。
- 普通はこういう書き方はしないと思うので、見直してください。
- for...of より forEach のほうが読みやすいので書き換えてください。
- ユーザ数だけクエリが出て遅くなります。GROUP BY で一括集計しませんか。
解説
このコードはユーザ 1 人ごとに 1 回クエリを発行する(N+1 問題)ため、数万件では応答が大きく遅れる。伝わる指摘は「何が起きるか(事実)」「なぜ問題か(理由)」「どう直せるか(提案)」がそろっている。「良くない」「普通は」は根拠がなく、何を直せばよいか分からない。forEach への書き換えは好みの範囲で、しかも await を正しく待たなくなるため、かえってバグを生む。
参考: google.github.io
この問題を含む 実務シチュエーション のテストを制限時間つきで解く
実務シチュエーションクイズへ