У меня есть несколько сущностей в хранилище данных 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, так как для этого необходимо включить биллинг.