Google NDB:从实体读取子实体的最佳方式,重复属性与常规查询?

时间:2014-07-12 11:27:37

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

假设我有这个非常简单的父母/子女关系(任何Answer班级实例总是有Question父母)

class Answer(ndb.Model):
    content = ndb.StringProperty()
    timestamp = ndb.DateTimeProperty()

    def to_message():
        """Returns a protoRPC message object of the answer"""


class Question(ndb.Model):
    content = ndb.StringProperty()
    answers = ndb.KeyProperty(repeated = True, kind = 'Answer')

    def to_message(self):
        """Returns a protoRPC message object of the question"""

两个to message方法仅用于返回protoRPC对象。 问题是:在我的to_message方法中,在Question类中,如果我想获取所有子Answer个实例,请检索它们,并使用自己的to_message方法把它们变成一个很好的rpc消息,它是否更好:

  • 迭代anwers重复的KeyProperty列表
  • 使用“父”属性上的过滤器执行查询,并迭代它输出的列表

就NDB访问而言,第一种方法似乎是最好的,但由于我们无论如何都要超过免费限制,我更想知道数据存储区在获取内容方面是否比我更有效率,遍历该列表。

编辑:原始问题实际上是一个非常简单明了的答案:第一种方式。 真正的问题是,如果我必须根据其属性过滤掉一些Answer实体(例如timestamp):使用过滤器进行查询是否更好,或者在列表上进行迭代并使用只收集“有趣”实体的条件?

2 个答案:

答案 0 :(得分:4)

使用该架构,您不必查询任何内容,因为您已将每个答案的键作为question_entity.answers

中的键列表

所以你只需要使用那些键来获取答案。如果只通过一次操作得到所有答案,那就更好了。

list_of_answers = ndb.get_multi(question_entity.answers)

NDB Entities and Keys更多信息)

另一方面,如果您使用KeyProperty中的Answer建模该关系:

class Answer(ndb.Model):
    question = ndb.KeyProperty(Question)
    content = ndb.StringProperty()
    timestamp = ndb.DateTimeProperty()

def to_message():
    """Returns a protoRPC message object of the answer"""

或与祖先:

answer = Answer(parent=question_entity.key)

在这些情况下,您应该使用普通查询来检索答案:

answers = Answer.query(Answer.question == question_entity.key)

或祖先查询:

answers = Answer.query(ancestor = question_entity.key)

分别

这意味着两个作业:查询索引获取数据存储区。总之,在这种情况下,第一种方法检索数据存储数据的成本更低。

答案 1 :(得分:2)

在密钥列表上使用ndb.get_multi来获取答案,然后迭代调用他们的to_message方法将是最有效的。