google-app-engine - 在 Google App Engine 中使用祖先或引用属性?

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

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

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

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

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

comment = Comment(aUser, key_name = commentId)

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

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

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

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

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

最佳答案

关于写入成本,您是对的,祖先是“免费” key 的一部分。如果引用属性被索引,则使用引用属性将增加您的编写成本。
由于您查询该引用属性是否需要编制索引。

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

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

关于google-app-engine - 在 Google App Engine 中使用祖先或引用属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12123511/

相关文章:

google-app-engine - 如何使用 REST API 从 Java/GAE 向 Azure 通知中心发送消息

google-app-engine - ndb中的一对多关系

python - 具有多个参数的页面未加载 CSS 文件

java - 对于 Google App Engine (java),如何在 FetchOptions 中设置和使用 block 大小?

image - GAE - 在服务器端获取图像宽度和高度

python - nose-gae 环境变量问题

java - gae 1.7.3 更新 -> java.io.InvalidClassException

python - 写入和图像附件作为头像 : Is it possible?

google-app-engine - 谷歌应用引擎 : Is it possible to do a Gql LIKE query?

google-app-engine - GAE : AssertionError: No api proxy found for service "datastore_v3"