2016-08-30 44 views
1

我几乎在任何地方阅读了关于构建高效查询的Firebase Database,但我仍然对两种替代方法有点混淆。Firebase - 为高效索引构造数据

例如,假设我想从过去7天左右获取用户的所有“maxBenchPressSessions”。

我这两个结构之间采摘之间卡住:

enter image description here

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

其中一个比另一个更快,还是会以相对相同的方式进行索引?我对数据库设计很陌生,所以我想确保我遵循正确的做法。

进展

我想出了将两者打平我的数据库,并允许我补充一个ListenerForSingleValueEvent使用orderBy只有一次的解决方案,但只有当我要检查,如果用户有一个会话保存一个特定的一天。

enter image description here

我可以有各自maxBenchPressSession对象具有在userId_dateString的格式的密钥。但是,如果我想从最近7天获得所有用户的会话,我不知道如何在一个查询中执行此操作。

任何想法?

+0

没有数据结构,它是固有地更快或更慢。区别取决于您如何从代码中访问数据。如果你显示你想写的查询,它会更容易帮助。一般来说:为您的应用程序访问数据建模数据。看到这篇关于[NoSQL数据建模]的文章(https://highlyscalable.wordpress.com/2012/03/01/nosql-data-modeling-techniques/) –

+0

我会用一个值事件监听器来做一个查询。我会在过去7天内从用户那里获得所有'maxBenchPressSessions'。 – Rafi

回答

1

我建议观看视频。它被告知有关数据的结构非常好。

References to the playlist on the firebase 3

Firebase 3.0: Data Modelling

Firebase 3.0: Node Client

+0

我在视频中看到他使用“用户名”作为键和用户的用户名作为值的部分,但这与Firebase文档在使用用户的用户名作为键和布尔值作为值时矛盾。 – Rafi

+0

我的问题更多的是要么更有效,要么这些方法是相同的。顺便说一句,我不是在试图传输数据。我只是简单地设置一个值事件监听器来获取数据一次。 – Rafi

0

当我明白一个道理火力有效地使用它。应该尽可能小地查询数据,并且无论多少请求都无关紧要。

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

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

enter image description here

.limitToLast(7) - 7 entries 
.orderByChild('negativeDate') - sort by date 

例子:

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

这与我所需要的非常接近,但这只能给我所有来自过去7天的会话,无论用户如何。我需要在过去七天内完成所有用户的会话。 – Rafi

0

然后添加用户,并把所有的会话。

enter image description here

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