<分区>
我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。
关闭 8 年前。
我知道关于实体组如何在 GAE 存储中工作的所有细节,但昨天(在帕洛阿尔托的 App Engine 聚会上),当一位演讲者解释他对实体组的使用时,我突然意识到我从未真正做到过在我自己的 GAE 应用程序中使用它们,我不记得在我使用过的开源 GAE 应用程序中看到过它们。
所以,我怀疑我只是忽略了(没有注意到或记住)这样的例子,因为我对它们还不够习惯,无法立即将“实体组的使用”与“正在解决的应用程序问题种类”联系起来 - - 我认为我应该通过研究这些资源来解决这个问题,并牢记这个目标,关注 EG 使用正在解决的问题(即,为什么应用程序可以使用它,但如果没有它就不能工作或不能很好地工作).
任何人都可以为此类代码推荐好的 URL 吗? (也欢迎发表论文,如果它们专注于解决应用程序级别的问题,但不如果像我见过的大多数文章一样,它们只关注 EG 如何工作的细节!-)。
最佳答案
实体组的主要用途是提供一种方法来更新事务中的多个实体。
如果您还没有使用过它们,请数一数您的祝福。要么你一直在设计你的数据模型,这样任何两个实体都不需要同时更新以保持一致,要么你确实需要它们但你很幸运:)
假设我有一个 Invoice 实体类型和一个 LineItem 实体类型。一张发票可以关联多个订单项。我的发票实体有一个名为 LastUpdated 的字段。每次将 LineItem 添加到我的发票时,我都想将当前日期存储在 LastUpdated 字段中。
我的更新函数可能是这样的(伪代码)
invoice.lastUpdated = now()
lineitem = new lineitem()
invoice.put()
lineitem.put()
如果 invoice put() 成功而 lineitem put() 失败会怎样?我的发票日期将显示某些内容已更新,但实际更新(新的 LineItem)不会在那里。解决方案是将两个 puts() 都放在一个事务中。
另一种解决方案是使用查询来查找最后插入的 LineItem 的日期,而不是将此数据存储在 lastUpdated 字段中。但这将涉及在每次您想知道上次添加订单项时获取发票和所有订单项,从而耗费您宝贵的数据存储配额。
编辑以回应海报的评论
啊。我想我理解你的困惑。上面的段落说明了为什么交易很重要。但是你说你仍然不关心实体组,因为你没有看到它们与事务的关系。但是,如果您使用的是 db.run-in-transaction,那么您正在使用实体组,也许您没有意识到!每笔交易只涉及一个实体组,任何给定的交易只能影响属于同一组的实体。见here
"All datastore operations in a transaction must operate on entities in the same entity group".
您在交易中做了哪些事情?有很多很好的理由只使用一个实体的事务,默认情况下它在它自己的实体组中。但有时你需要保持 2 个或更多实体同步,就像我上面的例子一样。如果 Invoice 和 LineItem 实体不在同一实体组中,则您无法将对它们的修改包装在 db.run-in-transaction 调用中。因此,无论何时您想要以事务方式对 2 个或更多实体进行操作,您都需要首先确保它们在同一组中。希望这样可以更清楚地说明它们为何有用。
关于google-app-engine - 在 App Engine 中使用实体组的良好开源示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1104810/
相关文章:
java - GAE/J 使用 1 个实体组还是多个实体组,获取速度更快吗?
node.js - 无法在谷歌应用引擎上部署我的 reactjs webpack 应用程序
google-app-engine - Google Cloud Platform 续订 SSL 证书停止应用程序服务
python - 通过 Google App Engine 创建 KhanAcademy 克隆 - app.yaml 中应用程序名称的问题
java - 通过 eclipse 在 Google 应用程序引擎中部署时数据库未部署