【问题标题】:How to create a feed of files from people that a user is following?如何从用户关注的人创建文件提要?
【发布时间】:2017-04-16 05:23:58
【问题描述】:

我正在使用 PHP 和 MongoDB 创建一个 API。在这个系统中,我得到了用户,每个用户都可以上传文件。用户也可以互相“关注”。

我需要返回经过身份验证的用户关注的用户上传的所有最新文件的提要。我不太确定如何设计和执行它。

这就是我正在考虑实施的。

  1. 获取用户关注的所有用户。
  2. 遍历这个用户数组,为每个用户获取最新的 4 个文件并将它们添加到数组中。
  3. 以某种方式按创建日期对这些文件(此数组)进行排序。
  4. 退货。

这真的是最佳方式吗?有没有更好的办法?用户保存在集合中 用户和文件在集合文件中。以下内容保存在集合 users.followers 中。

【问题讨论】:

    标签: php mongodb


    【解决方案1】:

    这是扇入与扇出的问题。我建议你尝试扇出:

    为您的用户保留feed 集合。当用户上传文档时,在她的每个朋友的提要项目集合中插入一个新提要项目。集合可能如下所示:

    {
        "_id": (some id)
        "UserId": (id of the user who 'owns', i.e. reads this feed)
        "FriendId": (if of the friend who posted the file)
        "FriendName": "John Doe" (name of the fried, denormalized)
        "Timestamp": ...
    }
    

    使用复合索引{UserId, Timestamp}

    这种方法的写入量很大:如果 Jane 有数百个朋友,那么这数百个插入将花费他们的时间。另一方面,无论如何,上传文件通常会花费大量时间,因此开销可以忽略不计,而且您的读取将非常简单。

    当然,这可以是further optimized 更多的努力,但它应该适合相当多的流量。

    【讨论】:

    • 听起来很有趣!当你说它写得很重。大约多长时间写入这些提要需要花费吗? 500 次写入需要 2-5 秒?快点?如果一个用户关注了 1000 个用户,那么这个提要文档会变得非常大而且很难处理吗?
    • 反之:如果一个用户有数千个粉丝,它会很重。真正需要多长时间取决于无数因素,但您应该能够在商品硬件上每秒进行数千次插入。您还可以离线进行扇出:后台工具会不断搜索新发布的文件,并在找到此类项目时插入新闻项目。做得对,延迟只有几秒钟,但您大大减少了网络服务器上的负载。
    • 延迟对我来说没有问题。所以只是看看我是否理解。我创建了一个名为 feeds 的集合,每个用户在 feeds 集合中各有一个文档。然后,当用户上传文件时,我在每个关注者提要文档中发布有关该文件的元数据作为子文档?这是正确的吗?
    • 每个新闻提要项都有自己的文档(不仅仅是每个用户),因此当用户上传文件时,您必须在 nn 个新文档/i> 是用户拥有的关注者数量。这里没有子文档在起作用。
    • 嗯,好的。您编写“为每个用户保留一个提要集合”。您是指单独的集合还是单独的文档?一个数据库可以容纳多少个集合?
    猜你喜欢
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    • 2017-11-28
    • 2023-03-23
    相关资源
    最近更新 更多