Google Appengine One To Many и запросы по collection_name - PullRequest
1 голос
/ 13 февраля 2012

В разделе: Один ко многим в 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)

Второй для выше снова запросит хранилище данных.

Если по какой-то причине вы перебираете «Скотт» и вызываете phone_numbers, он выполнит много операций чтения.Есть ли какой-то шаблон для их кэширования при первом чтении в течение срока действия запроса?или это должно быть обработано вручную?

Tx.

1 Ответ

2 голосов
/ 13 февраля 2012

Неявная коллекция 'phone_numbers' создается с помощью запроса, и кешировать результаты запроса довольно сложно. Трудно определить, какие результаты кэшированного запроса должны быть признаны недействительными в результате записи.

Одним из подходов может быть использование ndb и его поддержки кэширования (http://code.google.com/p/appengine-ndb-experiment/). ndb теперь включен в SDK, начиная с 1.6.2.

ndb не кэширует результаты запроса, но кэширует сущности, выбираемые по ключу, и поэтому вы можете сделать что-то подобное, чтобы использовать его кеширование (где PhoneNumber и Contact расширяют 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))

См. Это обсуждение - обратите внимание на предостережения: выполнение запросов и выборка ключей внутри транзакции в ndb: https://groups.google.com/group/appengine-ndb-discuss/browse_thread/thread/89dc6c019347b2a2/7f1db25d76515d07?lnk=gst&q=query+result+caching#7f1db25d76515d07

...