0

バックエンドとして 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 でこれを行うより良い方法はありますか?

4

1 に答える 1

0

トップ 10 のスコアを各ユーザーのエンティティに書き込んでみませんか?

ユーザー 1 の新しいスコアは 100 です! うん!

ユーザー 1 には 20 人の友達のリストがあります。

20 人の友人のリストを取得し、各エンティティのトップ スコア フィールドに 100 を追加します (上位 20 人の 1 つである場合)。

欠点: ユーザーが新しいハイスコアを獲得するたびに、すべての友人のエンティティを取得し、場合によってはそれらを更新することになります。読み書きのコストに注意してください もちろん、ユーザーが連続してハイスコアを取得した場合、友人の値は memcached になる可能性があります。

利点: 各トップ スコア エントリにタイムスタンプを付け、ユーザーが最後にプレイした時間を追跡し、ユーザーが最後にプレイしてからの新しいハイスコアをハイライトできます! ちょっとした考え...

于 2012-08-10T22:53:32.990 に答える