我偶然发现了 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()
只需计算 key 即可再次检索:
CustomerReport.query(ancestor=ndb.Key(ReportRoot, customer.key.id())).fetch()
谢谢。
最佳答案
使用没有相应保存实体的 key 作为父级是完全可以的。您甚至不需要创建 python 类,只需使用名称作为字符串即可:
parent=ndb.Key('ReportRoot', some_id)
不过,你的例子似乎很困惑。您认为仅使用客户的 key 作为报告的父级会获得什么?
关于java - GAE 祖先查询黑客 : is this a good practice?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25611832/