3

クライアントが特定のオブジェクトを参照できるように、一意の参照をクライアントに送信したいと考えています。appengine が提供するエンコードされたキーの長さは 50 バイトになることもありますが、必要なのはおそらく 2 バイトか 3 バイトだけです (4 バイトか 5 バイトが必要になることを期待できますが、それはしばらくの間ではありません!)。

一度に 400 の参照を送信する可能性があるため、より大きなキーを送信すると、実際には非常にコストがかかります。

したがって、これらの長いキーをより短いキーにマップしたいと考えています。明らかな解決策は、マッピングをデータストアに保存することですが、400 個のオブジェクトを送信すると、さらに 400 個のクエリを実行することになりますよね? おそらく、memcache にもマッピングのコピーを保持することで、費用を軽減できます。より良い方法はありますか?

appengine が作成し、それを使用するエンコードされていないキーから番号を取得することはできますか? アプリ全体ではなく、エンティティの種類ごとに一意であるために使用する ID のみが必要です。

ありがとう、

ライリー

4

2 に答える 2

5

データストア キーには、アプリ ID など、不要な追加情報が含まれています。したがって、キー全体を送信する必要はありません。

これらの参照がデータストア内の特定の Kind に対するものである場合は、より適切に行うことができ、key_name または数値 ID (キーが使用するもの) のみを送信できます。後者の場合、各キーをわずか数バイトで送信できます(特定のケースでどちらがよりコンパクトになるかに応じて、可変長または固定長の整数エンコーディングを選択できます[おそらく前者まで送信する ID のほとんどは非常に大きくなります])。

これらの部分的なキーをユーザーから受け取ったら、データストアからエンティティを取得するために必要な完全なキーを簡単に再構築できます。Python ランタイムを使用している場合は、db.Key.from_path(kind_name, numeric_id_or_key_name).

このようなスキームは、データストア/memcache を使用してカスタム マッピングを保存しようとするよりも単純であり、(はるかに) 高速です。

于 2010-09-24T00:54:49.750 に答える
1

カスタム マッピング メカニズムは必要ありません。エンティティ キー名を使用して短い識別子を保存するだけです。

entity = MyKind(key_name=your_short_id)
entity.put()

次に、これらの短い識別子を 1 つのクエリで取得できます。

keys = MyKind.all(keys_only=True).filter(...).fetch(400)
short_ids = [key.name() for key in keys]

最後に、MyKind.get_by_key_name(short_id)ユーザーから返された識別子からエンティティを取得するために使用します。

于 2010-09-24T09:30:56.090 に答える