我们如何在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'来表示两个实体之间的关系。这更像是一种联想,我承认我的第一个设计是不适应的。
答案 0 :(得分:1)
另一种方法是使用BigQuery。起初我们使用NDB,其中RawModel
存储单个非聚合记录,AggregateModel
存储聚合值。
AggregateModel
每次创建RawModel
时都会更新,这会导致一些不一致问题。事后看来,正如蒂姆建议的那样,正确使用父/祖先密钥会起作用,但最终我们发现BigQuery更加愉快和直观。
我们只有每天运行的cronjobs将RawModel
推送到BigQuery,而另一个用crenjobs创建带有从BigQuery获取的数据的AggregateModel
记录。
(当然,只有当您有批次数据汇总时才会有效)
答案 1 :(得分:0)
这确实取决于用例。对于少量项目,StructuredProperty和重复属性可能是最合适的。
对于大量实体,您将看到在组合键中设置父/祖先,并让KeyProperty指向多对一聚合中的主实体。
然而,选择也将在很大程度上取决于实际使用模式。然后考虑效率。
我能建议的最好的是仔细考虑你打算如何使用这些关系,它们的活跃程度(即它们是否经常变化,添加,删除),你是否需要在大多数时间看到关系的所有成员,或只是子集。这些考虑可能需要调整方法。