私のゲームでインターネットのハイスコアを実装したいと思います。そして、彼らが持っている場所(トップ100だけではない)にフィードバックを与える。通常のSQLで それは次のようになります。Google App Engineでインターネットのハイスコアを実装する方法
SELECT COUNT(*)をポイント>スコアFROM:WHEREポイントnewUsersPoints
とGQLは
db.GqlQuery似た何かを持っている(「スコアSELECT * FROM >: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スコアポイント>:1 ANDポイント> =:2"および<:3 "、newUsersPoints、range.from_pointsの範囲内のスコアよりもいくつのスコアが大きいか検索してください新しいスコアが、そのカウンターにし、インクリメントである、range.to_points).count()+ sumfrom2
検索範囲
スプリットように1000(または999)よりも大きいいるカウンタの範囲3. wouldn制限に達する
新しいスコアをスコア表に追加
これは非常に複雑でエラーが発生しやすいです。スコアを追加する前に、ある範囲とTimeoutを増やすことがあります。 (トランザクションではない)
第二のアイデア:
随時ソートすべてのスコアがポイントによると、彼らに新しいポジションを与える(スクリプトは、私たちはチャンクでそれをしなければならないタイムアウトかもしれません)
(一回毎日?)新しいスコアは我々だけdb.GqlQuery( "スコアポイント> SELECT * FROM:1 LIMIT 1"、newUsersPoints)やるとなる場所で見つけるために
。に.get()をprecalculated_position + 1
他のアイデア?