我已经阅读了有关扇出和大数据建模的不同文档,但我仍在努力弄清楚如何正确建模已签名用户的上下文信息。以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)。
答案 0 :(得分:1)
你想要使用分片。在GAE文档中有一些关于分片的内容,我相信你可以自己查找一下。以下是为GAE数据存储区设计的投票系统示例:
http://eatdev.tumblr.com/post/15093224320/handling-user-ratings-on-app-engine