Javascript Firebase排行榜,最佳实施。SQL联接和orderby
我正在使用Firebase作为数据库创建排行榜应用程序。我来自一个老派的SQL背景,所以这种新的noSQL类型的数据库给了我数据库键和引用的焦虑 如果我有组,每个组都有成员,然后所有用户都有各种测试的分数,那么对于一个按顺序显示给定测试分数的组,获取数据的最有效方法是什么。在SQL中,使用联接然后使用orderby显然是微不足道的,但到目前为止,在firebase文档中,我无法了解如何在客户端不进行一些排序工作的情况下高效地查询以获取联接数据块 我目前的解决方案如下所示,但在客户端进行所有排序似乎很痛苦。我目前获取组中的所有用户,然后迭代以获取每个用户的测试分数的单独记录。无论日期如何,我都需要在给定的测试中获得最高分数Javascript Firebase排行榜,最佳实施。SQL联接和orderby,javascript,web,firebase,firebase-realtime-database,Javascript,Web,Firebase,Firebase Realtime Database,我正在使用Firebase作为数据库创建排行榜应用程序。我来自一个老派的SQL背景,所以这种新的noSQL类型的数据库给了我数据库键和引用的焦虑 如果我有组,每个组都有成员,然后所有用户都有各种测试的分数,那么对于一个按顺序显示给定测试分数的组,获取数据的最有效方法是什么。在SQL中,使用联接然后使用orderby显然是微不足道的,但到目前为止,在firebase文档中,我无法了解如何在客户端不进行一些排序工作的情况下高效地查询以获取联接数据块 我目前的解决方案如下所示,但在客户端进行所有排序似
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
}
}
}
谢谢我认为你走的路肯定是对的。很抱歉对您的数据进行了一些更改,我不确定您如何拥有两个同名的键(第一个用户为test1,第二个用户为test2),但我会这样存储您的数据:
{
groupMembers : {
TestGroup : {
tests : {
test1 : true,
test2 : true
},
users : {
user1 : true
user2 : true
}
}
},
userTestScores : {
user1 : {
test1 : true,
test2 : true
},
user2 : {
test1 : true,
test2 : true
}
},
testScores : {
test1 : {
users : {
user1: {
date : "11/04/2016"
score : 90
},
user2: {
date : "15/04/2016"
score : 70
}
}
},
test2: {
users: {
user1: {
date : "11/06/2016"
score : 50
},
user2: {
date : "05/07/2016"
score : 80
}
}
}
}
}
然后你的查询将是找到一个测试组中的所有测试,然后你可以很容易地找到最好的分数
firebase.database().ref('/groupMembers/TestGroup/tests').once('value').then(function (snapshot) {
for (var test in snapshot.val()) {
firebase.database().ref('/groupMembers/testScores/tests/' + test + '/users/').orderByChild('score').limitToLast(1).once('value').then(function (snapshot) {
//highest score will be here
});
}
});
在NoSQL中,您通常按照您希望的访问方式对数据进行建模。我强烈推荐你在网上阅读这篇文章 如果我正确理解了您的问题,您希望显示一个特定组的排行榜,其中有该组得分最高的用户。要对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
});
这就是我的目标!在安卓系统中有类似的功能吗?