Firebase - 为高效索引构建数据

时间:2016-08-30 18:16:43

标签: firebase database-design firebase-realtime-database nosql

我几乎到处都在阅读有关构建Firebase Database以进行有效查询的内容,但我仍然对两种替代方案感到困惑。

例如,让我们说我希望得到所有用户" maxBenchPressSessions"从过去7天左右开始。

我在这两种结构之间挑选:

enter image description here

在第一个数组中,我使用用户的id作为属性来索引是真还是假。在第二个中,我使用userId作为属性NAME,其值将是用户的ID。

一个比另一个更快,还是会以相对相同的方式编入索引?我对数据库设计有点新意,所以我想确保我遵循正确的做法。

进步

我提出了一个解决方案,它既可以展平我的数据库又允许我仅使用ListenerForSingleValueEvent添加orderBy一次,但仅当我想检查用户是否保存了会话时特定的一天。

enter image description here

我可以让每个maxBenchPressSession对象都有userId_dateString格式的密钥。但是,如果我想获得过去7天内所有用户的会话,我不知道如何在一个查询中完成该操作。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

我建议观看视频。它很好地讲述了数据的结构。

References to the playlist on the firebase 3

Firebase 3.0: Data Modelling

Firebase 3.0: Node Client

答案 1 :(得分:0)

据我了解firebase的原理,有效地使用它。应该尽可能小地查询数据,并且无论有多少请求都无关紧要。

但你会接受这样的要求。我们必须在数据库“negativeDate”中添加另一个字段。

此字段允许您获取最后七个条目。这是一个视频 - https://www.youtube.com/watch?v=nMR_JPfL4qg&feature=youtu.be&t=4m36s

enter image description here

const ref = firebase.database().ref('maxBenchPressSession');
ref.orderByChild('negativeDate').limitToLast(7).on('value', function(snap){ })

请求示例:

int main()
{
    initialize();

    //rest of your code

}//end of main

答案 2 :(得分:0)

然后添加用户,它会放置所有会话。

enter image description here

const ref = firebase.database().ref('maxBenchPressSession/' + userId);
ref.orderByChild('negativeDate').limitToLast(7).on('value', function(snap){ })