私はリーダーボードを実装するために私のアプリケーションの機能に取り組んできました - 基本的にスコアに応じてユーザーをランク付けします。私は現在、個人ベースでスコアを追跡しています。私の考えでは、このリーダーボードは絶対的なものではなく相対的なものであるべきです。つまり、サイト全体で最高得点の上位 10 人のユーザー、つまりユーザーの友人ネットワークの上位 10 人を表示するのではありません。誰もが自分のネットワークで 1 位になるチャンスがあり、この種のことに関心のある人には友好的な競争の形があるため、これはより良いように思えます。私はすでに各ユーザーのスコアを保存しているので、課題はそのスコアのランクをリアルタイムで効率的な方法で計算する方法です。私は Google App Engine を使用しているため、いくつかの利点と制限があります (例:
例えば
1st ジャック 100
2nd ジョン 50
これが私が思いついたアプローチですが、どれも非効率的であるように思われ、このコミュニティはもっと洗練されたものを考え出すことができると思いました. 私の感覚では、すべてのソリューションは cron で行われる可能性が高く、読み取り操作を最適化するために毎日のランクとリストの順序を保存しますが、より軽量でリアルタイムなものがあればクールです
- スコア順に並べられたサイトのすべてのユーザーのリストを取得します。ユーザーごとに、そのリストから友達を選び、新しいランキングを作成します。ランクとリスト順を格納します。毎日更新します。短所 - 多くのユーザーを獲得すると、これには永遠に時間がかかります
2a. ユーザーごとに友達を選び、友達ごとにスコアを選びます。そのリストを並べ替えます。ランクとリスト順を格納します。毎日更新します。各ユーザーの最後の位置を記録して、既存のリストを使用して次の更新の並べ替えを効率化できるようにします (並べ替え時間を節約できます)。
2b. 前日にプロファイルが表示された人のランクとリストの順序のみを計算することを除いて、上記と同じ 短所 - プロファイルを表示した 2 番目のユーザーのランクのみが最新です