我想完成这个计划,以实现与我的 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
- 现在,当用户想要获得新分配时,我不是查询具有新分配并且我是其中成员的组,而是检查类的用户对象列表并检查哪些类具有新分配。
- 我按键检索这些类(到目前为止非常一致,对吗?)
- 我检查了班级的作业列表,并按键检索所有作业。
所以在整个过程中,我从来没有问过。所有结果都应该是高度一致的,对吧?这是一个好的解决方案吗?我是不是把事情复杂化了?我的读/写成本是否因此而飙升?你怎么看?