Сериализация свойств списка хранилищ данных GAE - PullRequest
1 голос
/ 12 октября 2009

Я смотрел это видео из Google I / O 2009: http://www.youtube.com/watch?v=AgaL6NGpkB8, где Бретт показывает пример микроблогов. Он описывает две схемы хранилища данных:

первый один:
class Message(db.Model):<br/> sender = db.StringProperty()<br/> body = db.TextProperty()<br/> receivers = db.StringListProperty()<br/>
и второй один:
class Message(db.Model):<br/> author = db.StringProperty()<br/> message = db.TextProperty()<br/><br/> class MessageIndex(db.Model)<br/> receivers = db.StringListProperty()<br/>
И он говорит, что в первом примере хранилище данных должно сериализовать / десериализовать свойство получателей каждый раз, когда мы запрашиваем сообщения по получателю, а во втором - нет. Я не могу понять, почему хранилище данных ведет себя по-разному в этих примерах, в обоих случаях получатели просто StringListProperty. Ты можешь это объяснить?

Ответы [ 2 ]

2 голосов
/ 29 октября 2009

В своем выступлении он предполагает, что при запросе вы хотите получить содержимое сообщения - «отправитель» и «тело». В App Engine сущности десериализуются в целом - вы не можете просто загрузить определенные поля - поэтому, когда вы делаете запрос в первом примере, он должен загрузить весь список получателей.

Во втором примере вы можете выполнить запрос только по ключам через MessageIndex, а затем извлечь и загрузить соответствующие объекты Message. Поскольку вы никогда не загружаете какие-либо свойства MessageIndex в память, вам не нужно десериализовать большой и дорогой связанный с ними список свойств.

0 голосов
/ 04 января 2013

Обратите внимание, что появилась новая функция - проекционные запросы, которая позволяет вам получать частичное представление ваших сущностей, но ТОЛЬКО на индексированных свойствах.

https://developers.google.com/appengine/docs/python/datastore/projectionqueries

Как это работает внутри, это то, что ваши сущности, ключи и индексы хранятся в разных таблицах. Если вы получаете всю сущность, вы должны выполнить поиск в основной таблице сущностей, что является дорогостоящим, поскольку оно должно десериализовать всю эту сущность (и довольствоваться любыми другими процессами, слоняющимися в этой таблице).

Проекционный запрос похож на запрос ключа, за исключением того, что вместо ключа сущности он использует набор индексированных значений в качестве ключа (потому что именно так работают таблицы индекса внутри). Если вы хотите получить подмножество данных и можете оправдать оплату за их индексацию (или, если она уже проиндексирована), прогнозный запрос будет быстрым и дешевым; он только смотрит в таблицы индексов и не должен касаться таблиц сущностей или ключей.

...