DATABASE HIERARCHY:
posts
post1_uid
author: user2UID
info1
info2
post2_uid
author: user1UID
info1
info2
users
user1_UID
info1
info2
info3
user2_UID
info1
info2
info3
状况:
用户可以创建帖子。每个帖子都有一个“author”属性,用于保存创建帖子的用户的UID。
如果我想显示来自一个用户的所有帖子,请写入我的Firebase GET请求:
CODE:
if (childData.author == firebase().auth().currentUser.uid) {
//Show those posts created by the current user
}
问题
如果我的Firebase数据库有数百万个帖子并且当前用户的ID需要与每个帖子的“作者”属性进行比较,这会有效吗?
如果不是,还有更好的选择吗?
我做了什么:
在我的“users / UID /”路径中创建一个“posts”节点,其中包含用户创建的所有帖子的UID。
就像那样,我迭代了一个小得多的json树(只有用户创建的所有帖子(100)),而不是遍历数据库中的所有帖子(Millions)来查找用户创建的那些帖子。但这真的会影响性能吗?数据嵌套的增加值得吗?
其他数据库层次结构:
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; DR:
如何正确组织Firebase数据库以优化查找用户创建的所有帖子的查询?
答案 0 :(得分:2)
答案是在每个用户内部明确地嵌套发布数据。
从整个帖子节点过滤时,这是主要的性能问题。首先,为了过滤当前用户的帖子,您必须运行postsRef.orderByChild('author').equalTo(currentUser.uid)
这样的查询,因为您注意到orderByChild
即使您使用author
上的索引也是昂贵的操作百万记录费用昂贵。
第二种方法的缺点是你复制了帖子条目,但是对于nosql数据库来说没问题,每次发生一些变化时你都要小心更新所有重复项。