1

GAEで大規模なクエリを実行することについて別の質問をしましたが、答えはほとんど不可能でした。

私がやりたいのはこれです:iOSデバイスから、すべてのユーザーの連絡先の電話番号を取得します。これで、たとえば250の電話番号のリストができました。これらの電話番号をサーバーに送り返し、これらの電話番号のどれがユーザーアカウントに属しているかを確認したいと思います。

だから私はクエリを行う必要があります:query = User.query(User.phone.IN(phones_list))

ただし、GAEの場合、これは非常にコストのかかるクエリです。この1つのクエリだけで250回の読み取りが必要であり、このタイプのクエリを頻繁に実行することを期待しています。

だから私はクレイジーなアイデアを思いついた。このタイプのクエリの方が安い別のホストや別のデータベースで電話番号をホストしないのはなぜですか。次に、GAEにHTTPリクエストを他のサーバーに送信させて、目的の情報を取得することができます。

だから私は2つの質問があります:

  1. これらの種類のクエリを処理するために、より合理化されたデータベースはありますか?また、より安価に実行できるデータベースはありますか?それとも、すべてGAEと同じでしょうか?
  2. これはやり過ぎですか?それは良い考えですか?私はそれを吸い上げて費用を払うべきですか?
4

2 に答える 2

1

GAEのデータストアは、サービスに十分対応できるはずです。アプリケーションは非常にうまく並列化できるように見えるので。

key_name1.現在の電話番号を使用しますUser

Userのkey_nameとしてnumberを設定すると、次のコードはクエリ速度を上げ、読み取り操作を減らします。

memcache.get_multi([phone_number1, phone_number2 ... ])
db.get([number1_not_found_in_memcache, number2_not_found_in_memcache])

memcache.set_multi("all_number_found_in_db")

2.1つのデータストアに複数の番号を保存します。

エンティティのサイズに直接関係しないGAEの運用コスト。したがって、大規模なエンティティがマルチデータを格納することは、運用コストを節約するもう1つの方法です。

たとえば、同じnumber_prefixを持つ複数の電話番号を一緒に保存します。

class Number(db.Model):
    number_prefix = db.StringProperty()
    numbers = db.StringListProperty(indexed = False)

# check number 01234567, 032123124
numbers = Number.get(["01", "03'])

# check 01234567 in number[0].numbers ?
# check 032123124 in number[1].numbers ?

このメソッドは、memcacheをさらに強化する可能性があります。

于 2012-10-23T15:50:08.620 に答える
0

提供されている他のアイデアを少し一般化...すべての検索キーが単一のユーザーに固有であると仮定します(たとえば、電子メール、電話、Twitterハンドルなど)

ユーザーの書き込み時に、一連のSearchIndex(...)を生成し、それを永続化できます。各SearchIndexには、ユーザーのキーがあります。次に、検索時に任意のSearchIndexのキーを作成し、2回のndb.get_multi_async呼び出しを実行できます。1つ目は一致するSearchIndexエンティティを取得し、2つ目はそれらのインデックスエンティティに関連付けられたユーザーを取得します。

于 2012-10-23T21:37:17.137 に答える