数据存储区中的祖先关系

时间:2017-11-03 04:45:26

标签: google-app-engine datastore

我有三个实体:userpostcommentuser可能有多个posts,而post可能有多个comments

我知道我可以添加这样的祖先关系:

user(Grand Parent) post(parent) comment(child)

我对祖先有点困惑。我从文档和搜索中读取祖先用于事务,每个祖先都在同一个实体组中,而实体组存储在同一个数据存储节点中,这使得它的可扩展性降低。这是正确的吗?

创建user作为posts的父级和post作为comments的父级是好事吗?

我们可以在post实体中添加一个额外的属性,例如user_id,如示例所示,并按其过滤。

哪个更好/更具伸缩性:过滤祖先的帖子或在user_id实体中添加额外的属性post并按其过滤?

我知道这两种方法都可以获得相同的结果,但我想知道哪种方法在性能和可扩展性方面更好?

抱歉,我是数据存储区的新手。

更新11/4/2017

大量用户正在使用此应用。很可能还有更多 每秒不超过一个帖子。但单个用户无法每秒创建多个帖子。但是多个用户可能是。如文档中所述,最大实体组写入速率为1 / s。是否仍然可以使用Ancestor?

同样的评论。多个用户可以在同一个实体组中添加注释。是的 一秒内很可能不止一条评论。

祖先查询更快?

我在许多地方读过,祖先的查询比其他人要快得多 我知道它们快速的原因是因为它在同一节点中创建实体组并存储相关数据。因此,与多个节点相比,从单个节点获取数据所需的时间更少。

例如:如果post存储在亚洲节点中,comment存储在欧洲节点中,我想获得posts and comments然后数据存储区API需要获取两个节点来完成请求。这让它变慢了。而不是我创建祖先关系并使实体组创建更好的性能。

但是,如果我不需要同时获取post and comment数据,该怎么办?如果我在单独的网页中需要post而在单独的页面中需要comment。在这种情况下,数据存储api一次只需要获取一个节点。在单个节点中保存数据或保存在多个节点中无关紧要节点。在这种情况下,祖先可以使查询性能更快吗?

2 个答案:

答案 0 :(得分:3)

是的,您是对的:所有与祖先相关的实体都在同一个实体组中,这引发了2个可伸缩性问题:数据争用和最大实体组写入速率为1 / s。以某种方式查看相关的Is there an Entity Group Max Size?

使用祖先有一些优点,有些人可能愿意为他们牺牲可扩展性(参见What would be the purpose of putting all datastore entities in a single group?),但恕我直言,不适合你的应用程序:我认为你会同意看到它并不是真的很重要每个新用户/帖子/评论在随机搜索后立即(即强烈的一致性) - 最终出现的事实是恕我直言已经足够好了。

根本没有祖先,并且为了允许交叉引用实体添加额外的模型属性(实体密钥甚至只是实体密钥ID,对于从不拥有祖先的实体)是更具可扩展性的方法,恕我直言与您的应用程序非常吻合。 / p>

答案 1 :(得分:0)

我认为要问的问题是:你期待:

  • 用户每秒创建帖子超过一次(我怀疑:)
  • 人们每秒不止一次对帖子发表评论(可能发生)

不是,那么拥有祖先查询将比普通查询更快。所以这取决于你的用例。除非你知道你的帖子会有数以千计的评论,否则我会提高查询速度。