查询没有父母的实体

时间:2012-05-01 21:23:12

标签: google-app-engine google-cloud-datastore app-engine-ndb

我正在努力将应用程序从db转换为ndb,并且正致力于提高查询效率。随着数据量的增加,应用程序变得有点慢,导致我们意识到查询效率很低。

背景

我们的精简数据模型与此类似(随意批评):

class ServiceRequest(ndb.Model):
  technician = ndb.UserProperty()
  application = ndb.KeyProperty()  # ServiceRequestApplication kind


class ServiceRequestApplication(ndb.Model):
  applicant = ndb.UserProperty()

管理员可以“批准”ServiceRequestApplication for ServiceRequest。 ServiceRequestApplications使用父ServiceRequest进行实例化。如果ServiceRequestApplication被批准,则应用程序的密钥存储在请求的应用程序属性中。

棘手的部分:

可以有多个ServiceRequest实体用于1个实际服务预约(每个技术人员1个)。我们有一个ServiceRequest,如果需要多个技术,我们创建额外的ServiceRequests,主ServiceRequest作为父服务。我们最初以这种方式解决问题,因为祖先查询非常简单,包括有关查询/表示此数据的方式的其他一些原因。

有人能想出一种方法来查询有子服务请求的ServiceRequest实体吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

在主题中,您询问有关没有父母的实体的查询;在你体内询问有关没有孩子的实体的问题。但在任何一种情况下,答案都是一样的:使用标准的App Engine索引是不可能的。前者需要搜索密钥中 not 的内容(索引的结构方式不可能),后者需要连接,因为它选择了实体基于其他实体的属性(或存在)。

相反,您需要进行非规范化:向ServiceRequest添加一个属性,该属性指示它是否为根实体,或者是否具有子项,视情况而定。