2012-02-13 8 views
1

によって多くおよび照会するには、Google AppEngineのひとつ:多くのに一つhttp://code.google.com/appengine/articles/modeling.html では、彼らはこれらの関係をモデル化する方法を示しています。はセクションでコレクション名

class Contact(db.Model): 
    # Basic info. 
    name = db.StringProperty() 
    birth_day = db.DateProperty() 

...

class PhoneNumber(db.Model): 
    contact = db.ReferenceProperty(Contact, 
            collection_name='phone_numbers') 

...

何それは私には思えるすると、以下の

scott = Contact(name='Scott') 
scott.put() 
PhoneNumber(contact=scott, 
      phone_type='home', 
      number='(650) 555 - 2200').put() 
PhoneNumber(contact=scott, 
      phone_type='mobile', 
      number='(650) 555 - 2201').put() 


for phone in scott.phone_numbers: 
    print '%s: %s' % (phone.phone_type, phone.number) 

for phone in scott.phone_numbers: 
    print '%s: %s' % (phone.phone_type, phone.number) 
を実行した場合

ことは、上記ための第二ですデータストアに再度照会します。

何らかの理由で "Scott"をループしてphone_numbersを呼び出していた場合は、多くの読み込みが実行されます。要求の存続期間中の最初の読み取り時にこれらをキャッシュするためのパターンがありますか?それとも手動で扱う必要がありますか?

Tx。

+0

あなたはそれを最初に取得するときは、memcacheの内のデータをキャッシュすることができますが、あなたがそのデータ保証はありません時間が経つとそこに居るでしょう。あなたが実際に実行しようとしているこの操作が近接して起こっている場合、memcacheは動作するはずです。以下はいくつかのドキュメントです:http://code.google.com/appengine/docs/python/memcache/usingmemcache.html – Sologoub

答えて

1

暗黙的なコレクション 'phone_numbers'はクエリによって構築されており、クエリ結果をキャッシュするのは難しいです。キャッシュされた問合せ結果を書込みの結果として無効にする必要があるかどうかを判断することは困難です。

1つのアプローチは、ndbとそのキャッシングサポート(http://code.google.com/p/appengine-ndb-experiment/)を使用することです。 1.6.2以降、SDKにndbが含まれるようになりました。

NDBは、クエリの結果をキャッシュしませんが、それはキーによってフェッチされたエンティティをキャッシュし、そしてあなたが(のPhoneNumberとの接触がndb.model.Modelを拡張)そのキャッシュ活用するために、このような何かを行うことができます:

phone_number = PhoneNumber(parent=contact_key, number='xxx') 
phone_number.put() 
.... 
phone_numbers = ndb.get_multi(PhoneNumber.query(ancestor=contact_key).fetch(keys_only=True)) 

これは再警告を注意しdiscussion--参照:キー対実行するクエリはNDBにトランザクション内でフェッチ:https://groups.google.com/group/appengine-ndb-discuss/browse_thread/thread/89dc6c019347b2a2/7f1db25d76515d07?lnk=gst&q=query+result+caching#7f1db25d76515d07

関連する問題