javascript - Firebase 排行榜,最佳实现。 SQL 连接和 orderby

标签 javascript web firebase firebase-realtime-database

我正在创建一个使用 Firebase 作为数据库的排行榜应用程序。我来自一个老派的 SQL 背景,所以这种新的 noSQL 类型的数据库让我对数据库键和引用感到焦虑。

如果我有组,每个组都有成员,然后所有用户都有各种测试的分数,那么获取按顺序显示给定测试分数的组数据的最有效方法是什么。在 SQL 中,这显然是微不足道的,使用连接然后使用 orderby 但到目前为止,在 firebase 文档中,我无法锻炼如何有效地查询以获取连接数据 block ,而无需在客户端进行一些排序工作

我目前的解决方案如下所示,但必须在客户端进行所有排序似乎很痛苦。我目前获取该组的所有用户,然后迭代以获取每个用户的测试分数的个人记录。无论日期如何,我都需要获得给定测试的单个最高分。

var testName = 'test1';
var scores = firebase.database().ref('/groupMembers/' + 'TestGroup').once('value').then(function(snapshot) {
                console.log(snapshot.val());
                for(var user in snapshot.val()){
                    //...query the database for each separate users score on test1
                }
            //sort the test scores here on client side js
            });

数据库设计的任何技巧都不会出错!

groupMembers{
   TestGroup{
       user1 : true
       user2 : true
   }
}

testScores{
   user1{
      test1{
         date : 11/04/2016
         score : 90
      }
     test1{
         date : 05/07/2016
         score : 100
      }
     test2{
         date : 11/06/2016
         score : 50
      }
   }
   user2{
      test1{
         date : 15/04/2016
         score : 70
      }
     test2{
         date : 05/07/2016
         score : 80
      }
     test2{
         date : 11/10/2016
         score : 50
      }
   }
}

谢谢

最佳答案

在 NoSQL 中,您通常会按照您希望的访问方式对数据进行建模。我强烈建议阅读这篇关于 NoSQL data modeling 的文章.

如果我对您的问题的理解正确,您想要显示特定组的排行榜,其中包含该组中得分最高的用户。要使用 Firebase 查询执行此操作,您可以使用此数据模型:

groupScores: {
  TestGroup: {
    user1: { // the highest score for user1
      test: "test1"
      date : 05/07/2016
      score : 100
    }
    user2: { // the highest score for user2
      test: "test2"
      date : 05/07/2016
      score : 80
    }
  }
}

所以您不会认为我只保留此模型中每个用户的最高分,无论用户在何种测试中获得该分数。这样每个用户在排行榜中只能出现一次。如果您的用例不同,则必须对数据进行不同的建模。

使用此数据结构,您可以获得排行榜:

var query = ref.child('groupScores/TestGroup').orderByChild('score').limitToLast(10);
query.on('value', function(snapshot) {
  // TODO: loop over children, invert them, show leaderboard
});

关于javascript - Firebase 排行榜,最佳实现。 SQL 连接和 orderby,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39449507/

相关文章:

android - 电子邮件地址格式错误 Firebase

javascript - 在 Visual Studio 2013 中,如何在构建后步骤中缩小 Javascript 和 CSS

JavaScript 闭包 : return values disunderstanding

web - 异常的alexa排名分数

用于更新 MYSQL 数据库的 PHP

python 页面响应基准测试(标题)

java - 如何将 Firebase 中的数据检索到 Android Studio

javascript - 在鼠标单击时添加标记并删除 openlayers 中现有的标记?

javascript - 排序并合并具有匹配值的 JSON 键

android - 将时间戳发布到 Android Firebase 数据库不起作用