Javascript 如何正确查询用户创建的所有帖子?

Javascript 如何正确查询用户创建的所有帖子?,javascript,node.js,firebase,firebase-realtime-database,Javascript,Node.js,Firebase,Firebase Realtime Database,数据库层次结构: posts post1_uid author: user2UID info1 info2 post2_uid author: user1UID info1 info2 users user1_UID info1 info2 info3 user2_UID info1 info2 info3 if (childD

数据库层次结构:

posts
   post1_uid
      author: user2UID
      info1
      info2
   post2_uid
      author: user1UID
      info1
      info2
users
   user1_UID
      info1
      info2
      info3
   user2_UID
      info1
      info2
      info3
if (childData.author == firebase().auth().currentUser.uid) {
    //Show those posts created by the current user
}
posts
   post1_uid
      author: user1UID
      info1
      info2
   post2_uid
      author: user1UID
      info1
      info2
users
   user1_UID
      info1
      info2
      info3
      posts
         referenceUID
            post1UID
            post2UID    
   user2_UID
      info1
      info2
      info3
情况:

posts
   post1_uid
      author: user2UID
      info1
      info2
   post2_uid
      author: user1UID
      info1
      info2
users
   user1_UID
      info1
      info2
      info3
   user2_UID
      info1
      info2
      info3
if (childData.author == firebase().auth().currentUser.uid) {
    //Show those posts created by the current user
}
posts
   post1_uid
      author: user1UID
      info1
      info2
   post2_uid
      author: user1UID
      info1
      info2
users
   user1_UID
      info1
      info2
      info3
      posts
         referenceUID
            post1UID
            post2UID    
   user2_UID
      info1
      info2
      info3
用户可以创建帖子。每个帖子都有一个“author”属性,该属性保存创建帖子的用户的UID

如果我想显示来自一个用户的所有帖子,我会在Firebase GET请求中写入:


代码:

posts
   post1_uid
      author: user2UID
      info1
      info2
   post2_uid
      author: user1UID
      info1
      info2
users
   user1_UID
      info1
      info2
      info3
   user2_UID
      info1
      info2
      info3
if (childData.author == firebase().auth().currentUser.uid) {
    //Show those posts created by the current user
}
posts
   post1_uid
      author: user1UID
      info1
      info2
   post2_uid
      author: user1UID
      info1
      info2
users
   user1_UID
      info1
      info2
      info3
      posts
         referenceUID
            post1UID
            post2UID    
   user2_UID
      info1
      info2
      info3

问题

如果我的Firebase数据库有数百万篇文章,并且需要将当前用户的id与每篇文章的“作者”属性进行比较,那么这样做是否有效

如果没有,是否有更好的选择


我所尝试的

在我的“users/UID/”路径中创建一个“posts”节点,其中包含用户创建的所有帖子的UID

与此类似,我遍历一个更小的json树(只有用户创建的所有帖子(100))而不是遍历数据库上的所有帖子(数百万)来查找用户创建的帖子。但这真的会影响性能吗?数据嵌套的增加值得吗


其他数据库层次结构:

posts
   post1_uid
      author: user2UID
      info1
      info2
   post2_uid
      author: user1UID
      info1
      info2
users
   user1_UID
      info1
      info2
      info3
   user2_UID
      info1
      info2
      info3
if (childData.author == firebase().auth().currentUser.uid) {
    //Show those posts created by the current user
}
posts
   post1_uid
      author: user1UID
      info1
      info2
   post2_uid
      author: user1UID
      info1
      info2
users
   user1_UID
      info1
      info2
      info3
      posts
         referenceUID
            post1UID
            post2UID    
   user2_UID
      info1
      info2
      info3
下面是实际的数据库层次结构,其中包含一些伪数据,以模仿我的示例的行为


TL;医生:

posts
   post1_uid
      author: user2UID
      info1
      info2
   post2_uid
      author: user1UID
      info1
      info2
users
   user1_UID
      info1
      info2
      info3
   user2_UID
      info1
      info2
      info3
if (childData.author == firebase().auth().currentUser.uid) {
    //Show those posts created by the current user
}
posts
   post1_uid
      author: user1UID
      info1
      info2
   post2_uid
      author: user1UID
      info1
      info2
users
   user1_UID
      info1
      info2
      info3
      posts
         referenceUID
            post1UID
            post2UID    
   user2_UID
      info1
      info2
      info3

如何正确组织Firebase数据库以优化搜索用户创建的所有帖子的查询?

答案是将帖子数据防御性地嵌套在每个用户内

这里是从整个posts节点进行筛选时的主要性能问题。首先,为了过滤当前用户的帖子,您必须像下面这样运行查询
postsRef.orderByChild('author').equalTo(currentUser.uid)
,正如您所注意到的
orderByChild
是一个昂贵的操作,即使您在
作者
上使用索引,也会花费数百万条记录


第二种方法的缺点是复制post条目,但对于nosql数据库来说这没关系,每次发生更改时更新所有副本时必须小心。

答案是将post数据防御性地嵌套在每个用户内部

这里是从整个posts节点进行筛选时的主要性能问题。首先,为了过滤当前用户的帖子,您必须像下面这样运行查询
postsRef.orderByChild('author').equalTo(currentUser.uid)
,正如您所注意到的
orderByChild
是一个昂贵的操作,即使您在
作者
上使用索引,也会花费数百万条记录

第二种方法的缺点是复制post条目,但对于nosql数据库来说这没关系,每次发生更改时都要小心更新所有副本