我在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服务,因为这需要启用结算功能。
答案 0 :(得分:4)
是的,您的假设是正确的,是的,您需要两个模型才能选择名称字段。