1

我在 Google I/O 2009 上观看了这段视频:http ://www.youtube.com/watch?v= AgaL6NGpkB8,其中 Brett 展示了微博示例。他描述了两个数据存储模式:

一个: 和第二个: 他说,在第一个示例中,每次我们通过接收者查询消息时,数据存储都必须序列化/反序列化接收者属性,而在第二个示例中则没有。我不明白为什么数据存储在这个例子中表现不同,在这两种情况下接收者只是 StringListProperty。你能解释一下吗?
class Message(db.Model):
    sender = db.StringProperty()
    body = db.TextProperty()
    receivers = db.StringListProperty()


class Message(db.Model):
    author = db.StringProperty()
    message = db.TextProperty()

class MessageIndex(db.Model)
    receivers = db.StringListProperty()

4

2 回答 2

2

在他的演讲中,他假设当您查询时,您想要检索消息的内容——“发件人”和“正文”。在 App Engine 中,实体作为一个整体被反序列化 - 您不能只加载某些字段 - 所以当您在第一个示例中执行查询时,它必须加载整个接收者列表。

在第二个示例中,您可以对 MessageIndex 执行仅键查询,然后获取并加载相应的 Message 实体。因为您从不将任何 MessageIndex 属性加载到内存中,所以您不需要反序列化与它们关联的大而昂贵的 list 属性。

于 2009-10-29T10:12:18.943 回答
0

请注意,有一个新功能,投影查询,它允许您获取实体的部分视图,但仅限于索引属性。

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

它在内部的工作方式是,您的实体、键和索引都存储在不同的表中。如果您获得整个实体,则必须在主实体表中进行查找,这很昂贵,因为它必须反序列化整个事物(并且满足该表中的任何其他进程)。

投影查询就像一个键查询,除了你的实体键,它使用一组索引值作为键(因为这就是索引表在内部操作的方式)。如果您想要一个数据子集并且可以证明付费将其编入索引(或者如果它已经编入索引),那么投影查询将既快速又便宜;它只在索引表中查找,不需要接触实体或键表。

于 2013-01-04T13:35:29.497 回答