Java GAE祖先查询黑客:这是一个好的实践吗?
我偶然发现了AppEngine数据存储的这一特性,即您实际上不必拥有一个持久化的根实体,就可以与GAE实现强一致的行为。可以使用计算键存储和加载子实体我的问题是:这是一种好的做法还是过于依赖于数据存储的实现技巧? 下面是一个使用Python的示例。我相信这个习惯用法也适用于Java 假设您有一个子实体: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
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)
不过,你的例子似乎有些困惑。仅使用客户的密钥作为报告的父级,您认为您获得了什么好处?我可以使用此技术避免在生成和读取报告时锁定客户实体组。