在Google App Engine中使用祖先或参考属性?

时间:2012-08-25 16:02:53

标签: google-app-engine google-cloud-datastore

目前,我的很多代码都广泛使用祖先来放置和获取对象。但是,我正在寻找改变一些东西。

我最初认为,如果你知道你正在寻找的实体的祖先是谁,那么祖先会更快地进行查询。但我认为事实证明,祖先对交易支持大多有用。我没有使用交易,所以我想知道祖先在这里是否比这更有帮助。

我所拥有的是一个用户实体,以及许多其他实体,例如评论,标签,朋友。用户可以创建许多评论,标签和朋友,因此每当用户这样做时,我都会将所有这些新创建的对象的祖先设置为用户。

因此,当我创建一个Comment时,我将祖先设置为用户:

comment = Comment(aUser, key_name = commentId)

现在,我这样做的唯一原因是严格用于查询目的。我认为当我想获得某个用户的所有评论以获得共同祖先的所有评论而不是查询authorEmail = userEmail的所有评论时会更快。

因此,当我想获得某个用户的所有评论时,我会这样做:

commentQuery = db.GqlQuery('SELECT * FROM Comment WHERE ANCESTOR IS :1', userKey)

所以我的问题是,这是对祖先的好用吗?是否每个Comment都有一个引用创建注释的User对象的ReferenceProperty,并按此过滤?

(另外,我的想法是使用祖先而不是索引的ReferenceProperty会节省写入费用。我在这里错了吗?)

1 个答案:

答案 0 :(得分:8)

你的写作成本是正确的,祖先是“自由”的关键的一部分。如果引用属性已编入索引,则使用引用属性将增加您的写入成本 由于您需要对该引用属性进行查询,因此需要对其进行索引。

如果你没有用相同的祖先创建每个评论,祖先不仅对交易很重要,在HRD(默认数据存储实现)中,quires也不会非常一致。

- 添加尼克的评论---
具有相同父级的每个实体将位于同一实体组中,并且对实体组的写入是序列化的,因此如果您同时编写多个实体,则使用此处的祖先将减慢速度。由于组中的所有实体都是由在您的实例中构成组的根的用户“拥有”,但这应该不是问题 - 事实上,您所做的实际上是推荐的设计模式