我偶然发现了 App Engine 的数据存储区的这个功能,即您实际上不必拥有持久的根实体即可与 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()
谢谢你。