在Google App Engine上组织实体组以进行编写

时间:2012-01-19 18:06:26

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

我对Google App Engine高复制数据存储区(HRD)上的“实体组”感到有些困惑。 Google文档提到HRD每个实体组只允许每秒写入1次。

这究竟是什么意思?这是每个用户请求写1个还是每个实体写1个(我假设它与“表”的概念类似)。

例如,如果我有“用户”实体和“发布”表。如果“Post”是“User”的祖先:

  1. 这是否意味着一个“用户”可以每秒创建一个“发布”
  2. ...或者是否意味着所有对“Post”实体的写入被限制为每秒写入1次而不管用户是什么? (即,无论提交帖子的用户数是多少,系统一次只能保存1个帖子)
  3. ...或者是否意味着单个“用户”实体不能同时创建超过1个“帖子”(即使有数千个其他用户创建“发布”实体)?
  4. 我可以选择哪种方法来缓解这种情况?同时制作“用户”和“发布”根实体是否合理?这是否允许我在1次写入限制之外创建多个“Post”实例?如果1000名用户同时创建“发布”条目,我想避免任何潜在的问题。

2 个答案:

答案 0 :(得分:8)

“实体组”,如“表格”。在appengine数据存储区中没有任何意味着“表”。你应该只考虑实体和索引。

如果您希望能够以事务方式执行操作,则只能使用实体组。对于带有“帖子”的博客,如果您以交易方式添加或删除帖子可能无关紧要,因此他们不需要在实体组中。

我的应用程序中有大约15种不同的实体,其中大约有1.5M。每一个都是一个根实体,甚至是相关实体,我认为这是AppEngine的理想选择。据我所知,实体组的唯一目的是支持多个实体的原子操作 - 它们不是组织工具。

PS:关于您对实体组限制的问题(我认为现在对您来说基本上没有意义):写入限制是每个实体,而不是每个请求。 1.实体不会创建其他实体。 2.如果所有帖子都在同一个实体组中,那么是的,你每秒只能节省1个。 3.如果每个用户都在自己的实体组中,您可以同时在每个相同的组中写一个帖子,每次多次,如您所愿。只是没有一个组可以每秒写一次以上。是的,我认为“用户”和“发布”都应该是根实体。

答案 1 :(得分:1)

使用实体组还可以使组内的数据高度一致。

例如,如果没有实体组,如果您创建帖子然后快速导航到最近的帖子列表,您可能不会立即看到新帖子。对于博客来说,这可能不是问题。

但是,如果您正在执行任务管理系统...您转到任务详细信息屏幕,关闭任务并导航您返回任务列表,该任务可能仍会显示为已打开。这是不可接受的。在这里,您需要实体组或其他方法来使您的任务列表与当前用户保持一致。

在某些数据模型中,可以轻松创建实体组。例如,假设您只能显示单个组的任务,那么将任务作为项目组的一部分可以解决问题。如果您的UI允许列出来自多个组的任务,则很难找到有效的模型。