1

我正在尝试在我的网站中构建某种KPI,并在如何检索数据方面苦苦挣扎。 例如,假设我建立一个博客用的模型:如何在ndb中总结查询

class MyPost(ndb.Model): 
    Author = ndb.KeyProperty(MyUser, required = True) 
    when = TZDateTimeProperty(required = True) 
    status = ndb.IntegerProperty(default = 1) # 1=draft, 2=published 
    text = ndb.TextProperty() 

,我想建立一个查询,将列出我的首要作者,会给我的(最好排序)

结果
['Jack':10, 'Jane':8, 'Joe',0] 

我能想到的2种方式:

  • 查询()获取()的所有项目和手动计数,然后 这是非常不有效的,但最灵活的
  • 作者在用户:结果[作者] =查询(...)。fetch()。count() 效率如此,并且需要提前知道我的索引(如果我想查询“作者的宠物宠物”

哪一个更好?

你会推荐什么其他方法?

+0

为创建的每个帖子在MyUser实体中保留一个运行总数。那么你不必数数。 – 2015-03-19 14:21:26

回答

2

我建议你去正火MyUser模式,即,引入冗余,通过给MyUserIntegerProperty,说numposts,冗余地跟踪有多少用户撰写MyPost实体。 NoSQL数据存储中经常需要去规范化。

您为这种适度的反规范化付出的代价是添加新帖子需要更多的工作,因为当发生这种情况时您还需要增加作者的numposts。但是,通常情况下,数据存储是“大部分读取” - 与查询现有数据相比,添加新实体相对较少。去标准化的目的是为了使后者的活动更加高效,对于重要的查询而言,对于前一个活动的成本适中。

+0

当然你是对的。但是,我怎样才能让它对时间敏感?由于这是用于KPI,我只需要最近的活动。例如:在过去30天内写入的帖子(或将来的操作,例如在日历应用程序中设置为即将到来的星期的约会) – 2015-03-19 22:43:38

+0

@idoroseman,您可以通过在cron作业中“批量”更新“时间敏感”非规范化属性定期执行。 – 2015-03-20 04:47:19

+0

这就是我所害怕的。自从在那个cron工作中,我回到了我的初始查询中(尽管在一个较小的数据集中) – 2015-03-20 08:22:33