11

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

我最初认为,如果您知道要查找的实体的祖先是谁,那么祖先有助于加快查询速度。但我认为事实证明,祖先对事务支持最有用。我不使用事务,所以我想知道祖先在这里是否是系统的负担而不是帮助。

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

因此,当我创建评论时,我将祖先设置为用户:

comment = Comment(aUser, key_name = commentId)

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

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

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

所以我的问题是,这对祖先有用吗?每个评论是否应该有一个 ReferenceProperty 来引用创建评论的用户对象,并以此过滤?

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

4

1 回答 1

8

您对写作成本是正确的,祖先是“免费”的关键的一部分。如果引用属性被索引,使用引用属性将增加您的写作成本。
由于您查询该参考属性是否需要被索引。

Ancestor 不仅对事务很重要,在 HRD(默认数据存储实现)中,如果您不使用相同的祖先创建每个评论,则查询将不会强一致。

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

于 2012-08-25T16:41:29.603 回答