我正在努力将应用程序从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实体吗?
谢谢!
答案 0 :(得分:1)
在主题中,您询问有关没有父母的实体的查询;在你体内询问有关没有孩子的实体的问题。但在任何一种情况下,答案都是一样的:使用标准的App Engine索引是不可能的。前者需要搜索密钥中 not 的内容(索引的结构方式不可能),后者需要连接,因为它选择了实体基于其他实体的属性(或存在)。
相反,您需要进行非规范化:向ServiceRequest添加一个属性,该属性指示它是否为根实体,或者是否具有子项,视情况而定。