【问题标题】:GAE: Modeling user Upvote/Downvote on entitiesGAE:对实体上的用户 Upvote/Downvote 建模
【发布时间】:2013-12-24 05:30:13
【问题描述】:

我已阅读有关扇出和大数据建模的不同文档,但我仍在努力弄清楚如何正确建模与登录用户相关的信息。以 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。这里的理论是分数将被并行获取,我的端点将与 post 查询加上最慢的分数一样快,而不是分数的总和。

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 我可能误解了您发布的文章,但我相信分片示例是用于计算投票计数/平均值。它的自我计数不是我要问的问题。我要问的是如何向登录用户表明他们是否对每个帖子投了赞成票或反对票。
    • 是的,我完全误解了这个问题,困难的部分通常是计算帖子的总分。你所做的几乎就是这样做的方法。我要做的一项更改是从 post+user 创建分数的键,在这种情况下,您不必查询它,您可以通过 ID 获取。否则结构很好。
    • 嗨 Dragonx,非常感谢。昨晚我得到了那个启示。创建复合键意味着我可以轻松获取(而不是查询)。它让 memcache 有机会完成它的工作。干杯。
    猜你喜欢
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-28
    • 1970-01-01
    • 2017-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多