ゲームにインターネットのハイスコアを実装したいと考えています。そして、プレイヤーにフィードバックを提供します (トップ 100 などだけではありません)。通常の SQL では、次のようになります。
SELECT COUNT(*) FROM Scores WHERE points > :newUsersPoints
とGQLには似たようなものがあります
db.GqlQuery("SELECT * FROM Score WHERE points > :1", newUsersPoints).count()
しかし、count() は 1000 に制限されているため、私の場合はあまり役に立ちません。これを実装する方法についてのアイデアはありますか?
私は2つを持っています
初め:
シャーディング カウンターのアイデアを使用する ( http://code.google.com/intl/pl/appengine/articles/sharding_counters.html ) ある範囲 (from_points、to_points) 内にいくつのスコアがあるかを格納する新しい「テーブル」を作成します。
range.to_points < newUsersPoints である上記の表のすべてのカウンターを合計します
新しいスコアが db.GqlQuery("SELECT * FROM Score WHERE points > :1 AND points >= :2 AND points < :3", newUsersPoints, range.from_points, range. to_points).count() + sumfrom2
新しいスコアが含まれる範囲を見つけ、そのカウンターをインクリメントします
3. カウンターが 1000 (または 999) より大きい範囲を分割して、限界に達しないようにします。
新しいスコアをスコア テーブルに追加する
これは非常に複雑で、エラーが発生しやすいものです。スコアを追加する前に、範囲とタイムアウトをインクリメントする場合があります。(非トランザクション)
2番目のアイデア:
時々 (毎日 1 回?) すべてのスコアをポイントで並べ替え、新しい位置を与えます (スクリプトはタイムアウトする可能性があるため、チャンクで実行する必要があります)。
新しいスコアがどの場所にあるかを調べるには、次のことを行います
db.GqlQuery("SELECT * FROM Score WHERE points > :1 LIMIT 1", newUsersPoints).get().precalculated_position + 1
他のアイデアはありますか?