Google app engine 数据存储中的祖先关系

Google app engine 数据存储中的祖先关系,google-app-engine,datastore,Google App Engine,Datastore,我有三个实体:user、post和comment。用户可能有多篇帖子,而帖子可能有多篇评论 我知道我可以像这样添加祖先关系: 用户(祖父母)发表(父母)评论(子女) 我对祖先有点困惑。我从文档和搜索中了解到,祖先用于事务,每个祖先都在同一个实体组中,实体组存储在同一个数据存储节点中,这使得它的可伸缩性降低。是这样吗 创建user作为posts的父项和post作为comments的父项是一件好事吗 与此相反,我们可以在post实体中添加一个额外属性,如user\u id所示,并根据它进行过滤 哪一

我有三个实体:
user
post
comment
用户
可能有多篇
帖子
,而
帖子
可能有多篇
评论

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

用户(祖父母)发表(父母)评论(子女)

我对祖先有点困惑。我从文档和搜索中了解到,祖先用于事务,每个祖先都在同一个实体组中,实体组存储在同一个数据存储节点中,这使得它的可伸缩性降低。是这样吗

创建
user
作为
posts
的父项和
post
作为
comments
的父项是一件好事吗

与此相反,我们可以在
post
实体中添加一个额外属性,如
user\u id
所示,并根据它进行过滤

哪一个更好/更具可伸缩性:按祖先筛选帖子,还是在
post
实体中添加额外的属性
user\u id
,然后按它筛选

我知道这两种方法可以得到相同的结果,但我想知道哪一种在性能和可伸缩性方面更好

对不起,我是数据存储新手

更新日期2017年11月4日

大量用户正在使用此应用程序。很可能还有更多 每秒超过一个帖子。但是单个用户每秒不能创建超过一个帖子。但多个用户可能是。如文件所述,最大实体组写入速率为1/s。还可以使用祖先吗

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

祖先查询更快?

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

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


但是,如果我不需要同时获取
post和comment
数据呢。如果我需要在单独的网页中发布
post
,并在单独的页面中发表
comment
。在这种情况下,数据存储api一次只需要获取一个节点。数据保存在单个节点中或保存在多个节点中并不重要。查询性能如何?祖先在这种情况下能否加快查询速度?

是的,您是正确的:所有祖先相关的实体都在同一个实体组中,这会引发两个可伸缩性问题:数据争用和最大实体组写入速率为1/s。看有什么关系吗

使用祖先有很多好处,有些人可能愿意牺牲可伸缩性(请参阅),但我不想牺牲你的应用:我想你会同意,在创建后立即在随机搜索中查看每个新用户/帖子/评论(即强一致性)并不是真的很重要-它最终出现的事实已经足够好了


简单地说,完全没有祖先,并添加额外的模型属性(实体键,甚至只是没有祖先的实体的实体键ID)以允许交叉引用实体,这是一种更具伸缩性的方法,IMHO非常适合您的应用程序。

我想问的问题是:您是否期望:

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

如果没有,那么拥有祖先查询将比普通查询更快。所以这取决于你的用例。除非你知道你的帖子上会有成千上万的评论,否则我会追求查询速度。

什么是IMHO?请您解释一下,如果您只是计划从一个实体引用另一个实体,则不需要实体组。正如我所知,祖先使用了强一致性,这对注释系统不好,因为它需要更多的时间,而最终需要一致性。有什么建议吗?我不认为祖先查询总是很快,请检查问题中的更新祖先查询并不是天生就快,它们更一致。依我拙见。我认为,通过实体组,注释实际上指的是祖先——API中没有专门引用组的内容。每秒可能有多篇帖子和评论。如果是,我还可以使用祖先关系吗?请参见问题中的更新我怀疑用户能否在1秒内创建帖子:)对于评论,您可以将其放在用户下,正如@Tim Hoffman在另一个问题中所建议的那样。()但在大多数情况下,我需要得到特定帖子的所有评论,最好让帖子成为家长而不是用户。如果在这种情况下,一秒钟内有多条评论,那么一般情况下,最好在单独的帖子中提出后续/相关问题(最终将原始问题链接/引用为上下文),因为这些问题往往会产生分歧,使事情复杂化,并损害整体可读性。这里我指的是
祖先查询更快?
问题,与原来的问题有很大不同。