GAE Ancestor Query Hack:这是一个好习惯吗?

时间:2014-09-01 19:18:40

标签: java python entity-framework google-app-engine eventual-consistency

我偶然发现了App Engine的数据存储区的这个功能,你实际上不必拥有一个持久的root实体来使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()

谢谢。

1 个答案:

答案 0 :(得分:2)

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

parent=ndb.Key('ReportRoot', some_id)
但是,你的例子似乎很困惑。您认为只是使用客户的密钥作为报告的父母而获得了什么?