質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.92%

バッジ機能の判定処理はどこに書くべき?

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 721
退会済みユーザー

退会済みユーザー

teratailのように「回答者Lv3」みたいなバッジ機能の実装方法についての質問です。

例えば、回答数が100回に達すると「回答者マスター」という一番上位のバッジがユーザーに与えられるとします。

この場合、ユーザーがコメントを実行した直後に毎回、累積回答数が何回かを判定しているのでしょうか?
つまり、データベースにユーザーが投稿したコメントを登録した直後に、そのユーザーの累積回答数を調べて、一定回数以上超えているかどうかをチェックして、認定条件を満たしているかどうかを判定しているのでしょうか?

その場合だと、既に回答数が100回超えている人に対しても、毎回、回答数のチェックと認定条件判定処理が走ってしまい、不効率なような気がするのですが、どのようにバッジ機能の判定部分って実装するのが良いのでしょうか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+5

データベースやクラス設計のレベルでは、毎回集計するというのが正解です。
そうすると、数え間違い(つまりバグ)がないからです。

しかし、そのせいでサービスが重くなり、質が下がったり、料金がかかったりでは意味がありません。誰も使わない美しいシステムにはなんの価値もないからです。

もし、影響が出るほどであれば集計のタイミングをトランザクションが多くない時間にバッチ処理で回すとか、サマリーデータを保持するとかの対策を組むとよいでしょう。初めから問題になることが証明できるなら最初からサマリーを使ってもよいと思います。しかし、私なら問題ないうちは放っておきます。

実際の負荷を計測して判定するのがあるべき姿ではないでしょうか。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/11 16:09

    ご回答ありがとうございます。

    皆様の回答をみてると、たいして気にするようなことでも無いのですね。

    キャンセル

  • 2017/05/11 20:15

    シンプルさを可能な限り保つことが大事。"You ain't gonna need it"
    https://ja.wikipedia.org/wiki/YAGNI
    https://ja.wikipedia.org/wiki/KISS%E3%81%AE%E5%8E%9F%E5%89%87

    キャンセル

+3

うーん、僕なら統計テーブル作ってそこに足し算していきますかね

Teratail風なら…
1.各アクションに応じて統計サービスにイベントを送信
2.統計サービスが統計を更新して完了通知をバッジ生成サービスに送信
3.バッジ生成サービスが統計情報を判断してスタッフのバッジ情報にバッジを追加

というような感じで、アクションに対して2~3の動作を非同期なバックグラウンドサービスとして実装しますかね

統計サービスは単にアクションに対応する統計を1増やすだけです。
実際に過去のデータを集計したりはしません。
(※不整合が見つかった時だけ対処するようにバッチ処理は行うと思いますけどね)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/11 16:13

    ご回答ありがとうございます!
    なるほどー!

    非同期で実行すれば、仮に諸々の判定絡みの処理がバッジ認定済みにとって既に不要なものになっていても、待機時間に影響しなくなって良さそうですね。

    大変参考になりました!

    キャンセル

+2

100回に1回しか有効でない判定を毎回行うのが無駄で嫌だと思うのであれば、Cron等で毎日1回(毎時1回でも)とかでバッチ処理を走らせる方法もあります。
こうすると全ユーザーの回答数を一気に確認する事が出来て、無駄が少なくなります。
欠点としては、リアルタイムなチェックができにくい事ですね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

1ユーザの累積回答数などたかが知れているので、
カウントしても問題ありません。

方法は考えればいくらでもあります。
バッチを管理するテーブルを作って、
それを検索すれば、ユーザがどのバッチを持っているかは分かります。

回答数が知りたければ、
回答を管理するテーブルに回答数を入れる。
直近の回答を1つ検索すれば、回答数を取得できる。

という感じで、DBの設計でどうにでもなります。
将来的に何がしたいか、何はしなくていいかを考えないと
設計できませんが。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る