質問: teratailのように「回答者Lv3」みたいなバッジ機能の実装方法についての質問です。 例えば、回答数が100回に達すると「回答者マスター」という一番上位のバッジがユーザーに与えられるとします。 この場合、ユーザーがコメントを実行した直後に毎回、累積回答数が何回かを判定しているのでしょうか? つまり、データベースにユーザーが投稿したコメントを登録した直後に、そのユーザーの累積回答数を調べて、一定回数以上超えているかどうかをチェックして、認定条件を満たしているかどうかを判定しているのでしょうか? その場合だと、既に回答数が100回超えている人に対しても、毎回、回答数のチェックと認定条件判定処理が走ってしまい、不効率なような気がするのですが、どのようにバッジ機能の判定部分って実装するのが良いのでしょうか?
回答: データベースやクラス設計のレベルでは、毎回集計するというのが正解です。 そうすると、数え間違い(つまりバグ)がないからです。 しかし、そのせいでサービスが重くなり、質が下がったり、料金がかかったりでは意味がありません。誰も使わない美しいシステムにはなんの価値もないからです。 もし、影響が出るほどであれば集計のタイミングをトランザクションが多くない時間にバッチ処理で回すとか、サマリーデータを保持するとかの対策を組むとよいでしょう。初めから問題になることが証明できるなら最初からサマリーを使ってもよいと思います。しかし、私なら問題ないうちは放っておきます。 実際の負荷を計測して判定するのがあるべき姿ではないでしょうか。