Java GAE祖先查询黑客:这是一个好的实践吗?

Java GAE祖先查询黑客:这是一个好的实践吗?,java,python,entity-framework,google-app-engine,eventual-consistency,Java,Python,Entity Framework,Google App Engine,Eventual Consistency,我偶然发现了AppEngine数据存储的这一特性,即您实际上不必拥有一个持久化的根实体,就可以与GAE实现强一致的行为。可以使用计算键存储和加载子实体我的问题是:这是一种好的做法还是过于依赖于数据存储的实现技巧? 下面是一个使用Python的示例。我相信这个习惯用法也适用于Java 假设您有一个子实体: CustomerReport(ndb.Model): foo=ndb.StringProperty bar=ndb.FloatProperty #... CustomerRepor

我偶然发现了AppEngine数据存储的这一特性,即您实际上不必拥有一个持久化的根实体,就可以与GAE实现强一致的行为。可以使用计算键存储和加载子实体我的问题是:这是一种好的做法还是过于依赖于数据存储的实现技巧?

下面是一个使用Python的示例。我相信这个习惯用法也适用于Java

假设您有一个子实体:

CustomerReport(ndb.Model):
  foo=ndb.StringProperty
  bar=ndb.FloatProperty
  #...
CustomerReports是基于实际实体类型Customer生成的。但是,您可以通过计算不存在的父实体的祖先密钥来保存此报表实体,具有很强的一致性,如下所示:

ReportRoot(ndb.Model):
  pass
像这样:

CustomerReport(parent=ndb.Key(ReportRoot, customer.key.id()), ... ).put()
只需计算密钥即可再次检索:

CustomerReport.query(ancestor=ndb.Key(ReportRoot, customer.key.id())).fetch()

谢谢。

使用没有相应保存实体的键作为父项是完全可以的。您甚至不需要创建python类,只需将名称用作字符串:

parent=ndb.Key('ReportRoot', some_id)

不过,你的例子似乎有些困惑。仅使用客户的密钥作为报告的父级,您认为您获得了什么好处?

我可以使用此技术避免在生成和读取报告时锁定客户实体组。