【问题标题】:appengine datastore model for twitter like showing posts from users followed用于 twitter 的 appengine 数据存储模型,例如显示关注的用户的帖子
【发布时间】:2017-06-13 18:17:02
【问题描述】:

我正在开发一个 Web 系统,该系统的功能类似于 Twitter 的概念,即关注用户列表并将他们的帖子视为列表。

我想出的简单模型需要join 操作,这在datastore 中不可用。

class Post(Model):
   author = reference to user id
   content = text content

class Following(Model):
   author = reference to user id
   followed_by = reference to user id

频繁的操作是显示当前用户关注的用户的帖子列表(按时间排序)。

使用上述模型,只能分两步完成:

authors = Following.author when Following.followed_by == current_user
posts = Posts with Posts.author in authors

有什么方法可以更有效地做到这一点?

【问题讨论】:

  • 就是这样。它需要 2 个查询。将第一个查询设为“仅键”查询以节省成本。
  • 好的。谢谢。如果我们必须在datastorecloud-SQL 之间进行选择,那么拇指规则应该是什么——比如“如果authors 查询通常返回>200 个实体,那么切换到SQL 是有意义的”。跨度>
  • 请注意IN操作符也有问题,见cloud.google.com/appengine/docs/standard/python/ndb/…

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


【解决方案1】:

您可以使用structure property 将所有帖子存储在 Author 对象中。

这里有一个interesting discussion,您可以从中选择最适合您的用例的方法。

【讨论】:

    【解决方案2】:

    如果您稍微更改算法,您可以使用单个查询来显示帖子。您可以使用以下实体跟踪需要为特定用户显示哪些帖子:

    class DisplayPost(Model):
       #parent entity = user for which the post should be displayed
       #key ID matches the Post's key ID
       posted = datetime  # if you want timed ordering in display
       expiry = datetime  # optional for periodic cleanup jobs
    

    每当作者创建新帖子时,您只需启动任务为作者的每个关注者创建此类实体。

    当您需要为某个用户显示帖子时,您可以进行单个祖先 keys_only 查询以获取 DisplayPost 键的列表:

    keys = DisplayPost.query(ancestor=user_key, ...).fetch(keys_only=True)
    

    从这里你得到一个对应的Post 键列表,并得到一个带有get_multi() 操作的帖子,类似于以下内容:

    post_keys = [ndb.Key(Post, key.id()) for key in keys]
    posts = ndb.get_multi(post_keys)
    

    这可以让您在显示帖子时获得更快的响应时间,无需 joinIN (also problematic) 操作。更好的可扩展性。付出的代价总是准备DisplayPost,即使其中一些永远不会被使用(例如,如果相应的用户甚至没有登录)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-02
      • 2017-04-05
      • 1970-01-01
      • 2022-01-11
      • 2019-02-10
      相关资源
      最近更新 更多