バックエンドとして GAE を使用し、単純なスコアリング システムを実装する Facebook アプリがあります。実際のモデルは、レベル データと複数のユーザーの可能性でもう少し雑然としていますが、単純化されたバージョンは次のとおりです。
class score(db.Model):
value = db.IntegerProperty()
user = db.StringProperty()
既にグローバル トップ 10 スコアを表示していますが、ユーザーのフレンドのトップ 10 スコアを表示するオプションも必要です。SQL 環境では、SELECT * FROM score WHERE user1 IN (...friendslist...) or user2 IN (...friendslist...) ORDER BY value LIMIT 10 のようなことをします。非リレーショナル データベースでは " IN" クエリはコストが高く、特に GAE では、一度に 30 個の値のブロックに制限されています。この方法でクエリを実装することは理想的ではありません。
私の現在の解決策は、各スコアを key_name = facebook id (アプリは最高のスコアのみを保存するため、キーの重複に問題はありません) で保存し、score.get_by_key_name(...friendslist...) を使用することです。この方法には多くの問題があります。すべての友達を照会する必要があり、これはすべての友達のスコアのソートされていないリストを返し、コードで解析する必要があります。
各スコア エンティティを memcaching することで負荷が少し軽減されますが、データストアに多くのスコアが入力されると memcache は適切にスケーリングされません。これは、リレーショナル データベースで単純な操作を実行するには依然として費用がかかり、面倒な方法です。Google App Engine でこれを行うより良い方法はありますか?