1

我想完成这个计划,以实现与我的 GAE 结构的高度一致性。目前,这就是我所拥有的(这真的很简单,我保证):

你有一个类(类意味着课堂不是编程“类”)模型和一个分配模型以及一个用户模型。现在,一个类有一个名为 memberIds 的整数列表属性,它是一个用户 ID 的索引列表。一个类也有一个分配 id 的字符串列表。

每当创建新的作业时,其各自的类实体也会更新,并将新的作业 ID 添加到其列表中。

我想做的是为用户获取新的作业。我所做的是查询所有 Classes where memberId = currentUserId. 我返回的每个班级都有一个作业 ID 列表。我使用这些 id 按键来获取它们各自的分配。在使用这个数据模型几个月后,我才意识到我可能无法获得与这个数据模型的强一致性(对于类查询部分)。

如果用户 A 发布了一个作业(从而更新了 ClassA),那么在几分之一秒后签入新作业的用户 B 可能还没有看到 ClassA 的更新更改(对吗?)。

这是不希望的。一种解决方案是用户祖先查询,但在我的情况下这是不可能的,并且实体组被限制为每秒 1 次写入,我不确定这是否足以满足我的情况。

所以这就是我的想法:每当发布新作业时,我们都会这样做:

  • 获取相应的 Class 实体
  • 将作业 ID 添加到班级
  • 获取该类所有成员的 id
  • 通过键获取所有成员用户
  • 用户实体具有用户所属的类列表。(一个 LocalStructuredProperty,有点像字典:{"classId" : "242", "hasNewAssignment" : "Yes"} )。我们将该类标记为hasNewAssignment = YES
  • 现在,当用户想要获得新分配时,我不是查询具有新分配并且我是其中成员的组,而是检查类的用户对象列表并检查哪些类具有新分配。
  • 我按键检索这些类(到目前为止非常一致,对吗?)
  • 我检查了班级的作业列表,并按键检索所有作业。

所以在整个过程中,我从来没有问过。所有结果都应该是高度一致的,对吧?这是一个好的解决方案吗?我是不是把事情复杂化了?我的读/写成本是否因此而飙升?你怎么看?

4

2 回答 2

2

查询不是强一致的。获取是强一致的。

我认为你做了正确的事:

  1. 您的访问是高度一致的。
  2. 您的读取会更便宜:一次获取比返回一个实体的查询便宜一半。
  3. 您写入的成本会更高:您还需要更新所有用户实体。

因此,成本取决于您的使用模式:您有多少作业读取与新作业创建。

于 2012-10-22T04:56:09.480 回答
0

我认为使用祖先查询是一个更好的解决方案。

  • 将分配实体的祖先设置为分配分配的类
  • 将学生实体的祖先设置为学生所属的类。

这样,特定班级中的所有作业和学生都属于同一个实体组。因此,对于一个只需要处理一个类的查询,可以保证强一致性。

注意,我假设不会有太多人不会同时将作业发布到课程中。(但任何数量的人都可以将作业发布到不同的班级,因为他们属于不同的实体组)

于 2015-02-17T10:09:24.520 回答