优化两条大路径的Firebase数据结构

优化两条大路径的Firebase数据结构,firebase,Firebase,我想我已经将反规范化作为在Firebase中存储数据时的一种主要优化方法,如本文中所述,但我仍停留在一个小细节上 假设我的领域里有两样东西,用户和帖子,就像我提到的,我可能有20000个用户和20000个帖子。因为我像个好孩子一样去规范化了一切,root/users/posts和root/posts一样存在。root/users/posts有一组值为true的post键,这样我就可以获得用户的所有post键 users: { userid: { name: 'johnny

我想我已经将反规范化作为在Firebase中存储数据时的一种主要优化方法,如本文中所述,但我仍停留在一个小细节上

假设我的领域里有两样东西,用户和帖子,就像我提到的,我可能有20000个用户和20000个帖子。因为我像个好孩子一样去规范化了一切,root/users/posts和root/posts一样存在。root/users/posts有一组值为true的post键,这样我就可以获得用户的所有post键

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吗?非常感谢。