GAE:为实体建模用户Upvote / Downvote

时间:2013-12-06 18:32:18

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

我已经阅读了有关扇出和大数据建模的不同文档,但我仍在努力弄清楚如何正确建模已签名用户的上下文信息。以reddit为例,我试图模拟帖子的Upvote / Downvote。所以这是我的两个实体:

class Score(ndb.Model):
   post = schema.KeyProperty(required=True)
   user = schema.KeyProperty(required=True)
   score_value = schema.IntegerProperty(default=0)

class Post(ndb.Model):
   # ... Other Properties ... #

   def fetch_score_async(self, user):
      self._score_query = Score.qry().filter(Score.post==self.key,
                                             Score.user==user.key).get_async()

   @property
   def user_score(self):
      ret = self._score_query.get_result()
      return ret.score_value if ret else 0

然后我遍历结果中的帖子列表并致电fetch_score_async

posts = Post.qry().filter(...).fetch_page(50)
for post in posts:
   post.fetch_score_async()

最后,我再次迭代帖子列表并构建JSON。这里的理论是得分将被并行获取,我的终点将与后查询加上最慢得分一样快,而不是得分的总和。

但是这样做的正确方法是什么?这感觉非常规和错误。我见过人们建议使用tasklet和/或map / reduce方法,但在这些情况下,他们有密钥和一对一或一对多的层次结构(google dev guide)。

1 个答案:

答案 0 :(得分:1)

你想要使用分片。在GAE文档中有一些关于分片的内容,我相信你可以自己查找一下。以下是为GAE数据存储区设计的投票系统示例:

http://eatdev.tumblr.com/post/15093224320/handling-user-ratings-on-app-engine