Затраты на извлечение крупных объектов в Google App Engine - PullRequest
2 голосов
/ 22 мая 2011

У меня есть несколько сущностей в хранилище данных Google App Engine, которые могут быть довольно большими (поскольку у них есть большие двоичные объекты, они могут иметь 1 МБ данных). Предположим, у меня есть класс сущности со следующими полями (для примера используется Python, но язык не имеет значения):

class File(db.Model):
    name = db.StringProperty()
    size = db.IntegerProperty()
    contents = db.BlobProperty()

Теперь, когда я делаю запрос, я получаю объект типа File, что, вероятно, означает, что между базой данных и веб-сервером будет передаваться 1 МБ данных, и будет создан объект Python 1 МБ. Верны ли эти предположения?

Если это так, если бы я хотел отобразить таблицу файлов без извлечения всего их содержимого, я бы сделал запрос, например

SELECT * FROM File ORDER BY name ASC

, а затем отобразите таблицу с именем и размером каждого файла. Правильно ли я считаю, что это фактически вытянет все содержимое каждого файла из хранилища данных в объект Python?

Поскольку GQL не допускает SQL-подобный "SELECT (name, size) FROM ...", я предполагаю, что нет другого пути, кроме создания отдельной сущности для фактического содержимого каждого файла.

class FileContents(db.Model):
    contents = db.BlobProperty()

class File(db.Model):
    name = db.StringProperty()
    size = db.IntegerProperty()
    contents = db.ReferenceProperty(FileContents)

Это нормальная практика? Есть ли другое решение? Обратите внимание, что я не хочу использовать службу Blobstore, так как для этого необходимо включить биллинг.

1 Ответ

4 голосов
/ 22 мая 2011

Да, ваши предположения верны, и да, вам нужно две модели, чтобы иметь возможность выбрать только поле имени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...