【问题标题】:Most efficient way to paginate large amount of data in Firebase在 Firebase 中对大量数据进行分页的最有效方法
【发布时间】:2017-03-06 08:09:30
【问题描述】:

我正在尝试为具有排名的帖子创建无限滚动(类似于 HackerNews),我想知道当有大量数据时,使用 Firebase 分页/创建无限滚动的最有效方法是什么。

我一直在做的方式是请求所有数据,对它们进行排序,然后限制滚动以创建无限滚动的感觉。有没有办法创建这个无限滚动而不必请求所有数据然后对它们进行排序?

我看到的这种方法的问题是,如果我们有 100K+ 条目,我们将不得不请求并排序 100K+ 条目,这不是很好。任何帮助将不胜感激!

【问题讨论】:

    标签: ios firebase pagination firebase-realtime-database


    【解决方案1】:

    由于排名是根据帖子创建后的时间和帖子获得的分数计算得出的值,因此您实际上只有两个选择。您可以获取所有帖子并在客户端计算排名(在您的情况下这不是一个选项),或者您可以在对帖子进行更新时计算排名。另外,我在 Swift 中给出了我的例子。

    本示例的数据库结构:

    posts : {
      $post: {
        stats : {
          score : scoreValue,
          ranking : rankingValue,
          createdAt : timestamp
        }
      }
    }
    

    具体而言,这意味着当创建新帖子时,您将为它分配默认分数并计算排名。

    由于排名现在存储在数据库中,您可以使用简单地获取前 x 个帖子

    postsRef.queryOrdered(byChild:"stats/ranking").queryLimited(toLast: x)
    

    或许

    ref.queryOrdered(byChild: "stats/ranking").queryEnding(atValue: "lowestScoreSoFar").queryLimited(toLast: x)
    

    现在,为了确保帖子的排名保持最新,您只需在更新分数的同一操作(交易)中更新排名。

    ref.runTransactionBlock({ (currentData: FIRMutableData) ->   FIRTransactionResult in
      if var stats = currentData.value as? [String : Any] {
        var score = stats["score"] as? Int
        var createdAt = stats["createdAt"] as? Long
        score += 1
        var ranking = calculateRanking(score, createdAt)
        stats["score"] = score
        stats["ranking"] = ranking
        currentData.value = stats
        return FIRTransactionResult.success(withValue: currentData)
      }
      return FIRTransactionResult.success(withValue: currentData)
    }) { (error, committed, snapshot) in
      if let error = error {
        print(error.localizedDescription)
      }
    }
    

    这种方法的一个问题是,如果没有人投票,得分高的帖子会一直浮动在顶部。为了应对这个黑客新闻,他们似乎在他们的服务器上运行了一个脚本,该脚本每 30 秒更新一个随机帖子在前 x 中的排名。您必须运行服务器并查看哪种设置最适合您的特定情况。

    如果您使用类似于 Hacker News 的算法,所有帖子的评分将趋向于 0,因此您可以尝试随机更新排名高于某个阈值的帖子的排名(这样您将忽略较旧且不相关的帖子)。

    Hacker News Algorithm

    More info on the algorithm

    How often does Hacker News recalculate rankings

    How Hacker News algorithm really works

    【讨论】:

    • 感谢@Pieter Laebens 的回答。我想过这个方法。但是,如果我的积分只是原始积分,并且我想根据排名对帖子进行分页,因为排名也与时间相关(较旧的帖子排名较低),我应该如何对这些数据进行分页?
    • 分数是像交易一样增加还是计算出来的?
    • 感谢您的精彩回答!我知道我需要运行服务器端代码。
    猜你喜欢
    • 2011-06-04
    • 1970-01-01
    • 2023-03-17
    • 2015-05-02
    • 1970-01-01
    • 2012-08-04
    • 2022-01-18
    相关资源
    最近更新 更多