在Google App Engine中检索大型实体的开销

时间:2011-05-22 03:46:23

标签: google-app-engine

我在Google App Engine数据存储中有一些实体可能非常大(因为它们中有blob,它们可能有1MB的数据)。让我们假设我有一个带有以下字段的实体类(使用Python作为示例,但语言无关紧要):

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

现在当我进行查询时,我找回了File类型的对象,这可能意味着数据库和Web服务器之间将有1MB的数据传输,并且将创建一个1MB的Python对象。这些假设是否正确?

如果是这样,如果我想显示一个文件表而不检索所有内容,我会进行查询,例如

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 个答案:

答案 0 :(得分:4)

是的,您的假设是正确的,是的,您需要两个模型才能选择名称字段。