优化两条大路径的Firebase数据结构
我想我已经将反规范化作为在Firebase中存储数据时的一种主要优化方法,如本文中所述,但我仍停留在一个小细节上 假设我的领域里有两样东西,用户和帖子,就像我提到的,我可能有20000个用户和20000个帖子。因为我像个好孩子一样去规范化了一切,root/users/posts和root/posts一样存在。root/users/posts有一组值为true的post键,这样我就可以获得用户的所有post键优化两条大路径的Firebase数据结构,firebase,Firebase,我想我已经将反规范化作为在Firebase中存储数据时的一种主要优化方法,如本文中所述,但我仍停留在一个小细节上 假设我的领域里有两样东西,用户和帖子,就像我提到的,我可能有20000个用户和20000个帖子。因为我像个好孩子一样去规范化了一切,root/users/posts和root/posts一样存在。root/users/posts有一组值为true的post键,这样我就可以获得用户的所有post键 users: { userid: { name: 'johnny
users: {
userid: {
name: 'johnny'
posts: {
-Kofijdjdlehh: true,
-Kd9isjwkjfdj: true
}
}
}
posts: {
-Kofijdjdlehh: {
title: 'My hot post',
content: 'this was my content',
postedOn: '3987298737'
},
-Kd9isjwkjfdj: {
title: 'My hot post',
content: 'this was my content',
postedOn: '3987298737'
}
}
现在,我想列出用户发布的所有帖子的标题。我不想为了获得标题而加载所有20000篇文章。我只能想到以下几种选择:
使用root/users/posts路径中设置为true的键子集以某种方式查询root/posts路径如果可能的话,我还没有弄清楚如何查询
将标题存储在root/users/posts中,以便该路径中的每个条目都有重复的标题,如下所示:
职位:{
-科菲杰德勒:是的
}
变成
职位:{
-Kofijjdlehh:{
标题:“这是我的内容”
}
}
这似乎是合理的,但我没有看到一个这样做的例子,所以我担心这是一些反模式
另一种我一直找不到的方法
我非常感谢您在本用例中提供的任何指导或我可能错过的文档。这两种都是有效的解决方案。对于读取数据的人来说,1将是更多的工作,而保存数据时,2将是更多的工作。同样对于2,你必须处理帖子标题的更新,尽管这对于新的来说是非常容易的 要实现1,您必须执行两个查询。这里有一个非常基本的解决方案,它只处理添加帖子。它侦听添加到用户的帖子,然后将一个侦听器连接到每个帖子的标题
var usersPosts = {};
ref.child('users').child(userId).child('posts').on('child_added', function(idSnap) {
var id = idSnap.key();
ref.child('posts').child(id).child('title').on('value', function(titleSnap) {
usersPosts[id] = titleSnap.val();
});
});
对于第三个解决方案,您可以使用,它可以自动处理上述场景以及更多。这段代码基本上与上面的代码相同,只是它附带了一个额外的功能,可以让您处理一个ref
new Firebase.util.NormalizedCollection(
[ref.child('users').child(userId).child("posts"), "posts"],
[ref.child("posts"), "post"]
).select(
{
key: "posts.$value",
alias: "x"
},
{
key: "post.title",
alias: "title"
}
).ref();
请注意,x值始终为真。必须选择该选项,因为firebase util要求您从每个路径中至少选择一个字段。这些选项似乎假设我已连接并等待数据更改。当一个用户连接时,我需要同时查询他们历史上添加的给定用户的所有帖子标题,该怎么办?我可以从posts路径中获取与用户/posts路径中的任何ID匹配的POST子集吗?不,我编写的两个解决方案不假设您已连接并等待数据更改。他们会检索您所请求的内容,并将继续侦听更多数据。每个孩子,无论老少,都需要添加child_。首先对现有值调用value,然后在每次更改时调用value。啊,对。对我来说,这是一个很难保留的范例。好吧,我想这已经开始被人接受了。我对循环数据访问进行了很好的培训,因此重新学习这一部分很困难。感谢您的帮助。@AnidMonsur您能提供android java代码来实现1吗?非常感谢。