如何在GAE上使用NDB实现组合/聚合

时间:2014-05-12 22:31:01

标签: python django google-app-engine composition

我们如何在Google App Engine上使用NDB实现聚合或合成?根据用例进行的最佳方法是什么? 谢谢!

我试过使用重复的属性。在这个非常简单的示例中,Project有一个Tag键列表(我选择以这种方式编码,而不是使用StructuredProperty,因为许多Project对象可以共享Tag对象。)

class Project(ndb.Model):
    name = ndb.StringProperty()
    tags = ndb.KeyProperty(kind=Tag, repeated=True)
    budget = ndb.FloatProperty()
    date_begin = ndb.DateProperty(auto_now_add=True)
    date_end = ndb.DateProperty(auto_now_add=True)

    @classmethod
    def all(cls):
        return cls.query()

    @classmethod
    def addTags(cls, from_str):
        tagname_list = from_str.split(',')
        tag_list = []
        for tag in tagname_list:
            tag_list.append(Tag.addTag(tag))
        cls.tags = tag_list

-

编辑(2): 谢谢。最后,我选择创建一个新的Model类'Relation'来表示两个实体之间的关系。这更像是一种联想,我承认我的第一个设计是不适应的。

2 个答案:

答案 0 :(得分:1)

另一种方法是使用BigQuery。起初我们使用NDB,其中RawModel存储单个非聚合记录,AggregateModel存储聚合值。

AggregateModel每次创建RawModel时都会更新,这会导致一些不一致问题。事后看来,正如蒂姆建议的那样,正确使用父/祖先密钥会起作用,但最终我们发现BigQuery更加愉快和直观。

我们只有每天运行的cronjobs将RawModel推送到BigQuery,而另一个用crenjobs创建带有从BigQuery获取的数据的AggregateModel记录。

(当然,只有当您有批次数据汇总时才会有效)

答案 1 :(得分:0)

这确实取决于用例。对于少量项目,StructuredProperty和重复属性可能是最合适的。

对于大量实体,您将看到在组合键中设置父/祖先,并让KeyProperty指向多对一聚合中的主实体。

然而,选择也将在很大程度上取决于实际使用模式。然后考虑效率。

我能建议的最好的是仔细考虑你打算如何使用这些关系,它们的活跃程度(即它们是否经常变化,添加,删除),你是否需要在大多数时间看到关系的所有成员,或只是子集。这些考虑可能需要调整方法。