【ITニュース解説】Balance Through Completeness: Scaling Candidate Profiles in Laravel
2025年09月04日に「Dev.to」が公開したITニュース「Balance Through Completeness: Scaling Candidate Profiles in Laravel」について初心者にもわかりやすいように丁寧に解説しています。
ITニュース概要
Laravelで求職者プロフィールを扱う際、初期は応募時に詳細情報を取得しなくても問題なかった。しかし、ユーザー増加に伴い、プロフィールの完成度でフィルタリングする必要が出てきた。当初は動的に計算していたが、データ量増加で処理が遅延。そこで、完成度を専用テーブルに保存し、データ更新時に自動計算する方式に変更。これにより、検索が高速化し、保守性も向上した。
ITニュース解説
この記事では、LaravelというPHPフレームワークを使って構築された求人ポータルサイトで、候補者のプロフィールの完成度に基づいて求職者を絞り込む機能を実装する際の、システムのスケーラビリティ(規模が大きくなっても問題なく動作する能力)に関する課題と、その解決策について解説する。
初期段階では、求職者が登録し、いくつかの詳細情報を入力して、求人に応募するというシンプルな流れでシステムが構築されていた。採用担当者は、応募者の情報を確認し、選考を進める。しかし、ユーザー数が増加するにつれて、プロフィールの完成度が低い求職者からの応募も多くなり、採用担当者は質の高い応募者を見つけるのが難しくなってきた。初期のシステムでは、応募の日付順にしか並べ替えられなかったため、プロフィールの完成度を考慮した絞り込みができなかった。プロフィールの完成度が高い求職者は、一般的に求職意欲が高いと考えられるため、それを最初のフィルタリング基準として活用したいというニーズがあった。
簡単な解決策として、プロフィールの完成度をその場で計算し、それに基づいて並べ替えやフィルタリングを行う方法が採用された。具体的には、データベースから求職者の名前、メールアドレス、職務経歴、学歴などの情報を取得し、それぞれの項目の入力状況に基づいてスコアを計算する。このスコアをプロフィールの完成度として利用し、採用担当者が応募者を絞り込めるようにした。
しかし、この方法はユーザー数やデータ量が増加すると、パフォーマンスに問題が生じる可能性があった。プロフィールの完成度を計算するために、複数のテーブルを結合する必要があり、計算処理も複雑になるため、データベースへの負荷が高まる。また、プロフィールの完成度の計算方法を変更する必要が生じた場合、クエリ(データベースへの問い合わせ)の修正が困難になるという問題もあった。さらに、この計算処理は他の場所でも再利用する必要があった。
より良い解決策として、プロフィールの完成度を別のテーブルに保存し、求職者の情報が変更された際に自動的に更新する方法が採用された。まず、profile_completionsというテーブルを作成し、求職者のID、プロフィールの完成度(0〜100%)、更新日時などを保存するように設計した。
次に、求職者の情報が変更された際に、プロフィールの完成度を再計算し、profile_completionsテーブルを更新する仕組みを構築した。具体的には、ProfileCompletenessCalculatorというサービスを作成し、求職者の情報を基にプロフィールの完成度を計算するメソッドを実装した。このサービスは、求職者の名前、メールアドレス、職務経歴、学歴などの情報の入力状況を確認し、それぞれの項目の入力状況に基づいてスコアを計算する。
そして、求職者の情報が変更されるたびに、このサービスを利用してプロフィールの完成度を再計算し、データベースを更新する。例えば、職務経歴が追加または削除された際に、Resumeモデル(Laravelにおけるデータベースのテーブルを表すクラス)のイベントリスナー(特定のイベントが発生した際に実行される処理)を利用して、プロフィールの完成度を再計算し、データベースを更新するようにした。
この解決策により、採用担当者が応募者を検索する際に、プロフィールの完成度をその場で計算する必要がなくなり、データベースへの負荷が軽減された。また、プロフィールの完成度の計算方法を変更する必要が生じた場合でも、ProfileCompletenessCalculatorサービスを修正するだけで済むため、メンテナンス性が向上した。さらに、プロフィールの完成度の計算処理を他の場所でも再利用できるようになった。
最終的に、採用担当者は、プロフィールの完成度に基づいて応募者を絞り込んだり、特定のプロフィールの完成度を満たす応募者のみを表示したりすることができるようになった。例えば、プロフィールの完成度が70%以上の応募者のみを表示したり、プロフィールの完成度が100%の応募者のみを表示したりすることができる。
この記事では、初期段階では簡単な解決策で十分だが、システムが成長するにつれて、スケーラビリティとメンテナンス性を考慮した設計が必要になることを示している。最初から完璧なシステムを構築する必要はないが、ある程度の規模になったら、適切な設計を検討することが重要である。