0

У меня есть модель выглядит следующим образом:Вычисление суммы переменной внутри всех детей (рекурсивный)

class SomeModel(ndb.Model): 
    parent = ndb.KeyProperty() 
    someint = ndb.IntegerProperty(default = 2) 
    sum_of_child_some_int = ndb.IntegerProperty() 

родитель свойство не является либо ничего (в случае верхнего родительского уровня) или является Ключ, указывающий на другой SomeModel объект.

Мой вопрос, что является наиболее эффективным способом вычисления суммы всех someint «ы всех детей в SomeModel родителя? Он рекурсивный, поэтому ребенок может сам иметь ребенка, а someint также нужно будет подсчитать.

Я вижу, что это можно сделать при записи - просто написать рекурсивно сущности родителям. Но можно ли это читать, или это всегда будет слишком дорого?

ответ

2

Если вы не хотите указывать это число во время записи, вы можете использовать запрос предка, чтобы получить все дочерние объекты данного объекта и извлечь свойство someint. Если вы собираетесь это сделать, я думаю, что наиболее эффективным способом было бы использовать projection queries.

Просто помните, что если вы не будете писать эту сумму, когда вы поместите объект, вам придется делать сумму каждый раз, когда она запрашивается (хотя вы можете получить кешированный результат), что звучит немного расточительно. Память дешевая, и добавление еще одного свойства, обновленного во время записи, кажется мне самой лучшей идеей.

Кстати, может быть, вам не нужен родительский ключ как KeyProperty, ancestor может быть лучшим способом сделать это.