实体组的主要用途是提供在事务中更新多个实体的方法。
如果您不必使用它们,请数一数您的祝福。要么您一直在设计您的数据模型,因此没有两个实体需要同时更新以保持一致,或者您确实需要它们但您很幸运 :)
假设我有一个 Invoice 实体类型和一个 LineItem 实体类型。一张 Invoice 可以关联多个 LineItems。我的发票实体有一个名为 LastUpdated 的字段。每当 LineItem 添加到我的 Invoice 时,我都想将当前日期存储在 LastUpdated 字段中。
我的更新功能可能看起来像这样(伪代码)
invoice.lastUpdated = now()
lineitem = new lineitem()
invoice.put()
lineitem.put()
如果发票 put() 成功而 lineitem put() 失败会发生什么?我的发票日期将显示某些内容已更新,但实际更新(新 LineItem)将不存在。解决方案是将两个 puts() 都放在一个事务中。
另一种解决方案是使用查询来查找最后插入的 LineItem 的日期,而不是将此数据存储在 lastUpdated 字段中。但这将涉及每次您想知道最后一次添加订单项时都获取发票和所有订单项,从而花费您宝贵的数据存储配额。
编辑以回应海报的评论
啊。我想我理解你的困惑。上述段落说明了为什么交易很重要。但是您说您仍然不关心实体组,因为您看不到它们与事务的关系。但是,如果您使用的是 db.run-in-transaction,那么您正在使用实体组,也许您并没有意识到!每个事务只涉及一个且仅一个实体组,并且任何给定事务只能影响属于同一组的实体。看这里
“事务中的所有数据存储操作必须对同一实体组中的实体进行操作”。
您在交易中做了哪些事情?仅使用一个实体的交易有很多充分的理由,默认情况下,该实体位于其自己的实体组中。但有时您需要保持 2 个或更多实体同步,例如我上面的示例。如果 Invoice 和 LineItem Entities 不在同一个实体组中,那么您无法将对它们的修改包装在 db.run-in-transaction 调用中。因此,无论何时您想要对 2 个或更多实体进行事务操作,您都需要首先确保它们在同一个组中。希望这可以更清楚地说明它们为什么有用。