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数据库来说这没关系,每次发生更改时都要小心更新所有副本