我正在创建一个使用 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/