我正在使用firebase制作博客应用。
我想知道数据结构的最佳实践。
据我所知,有2个案例。 (我使用的是本地反应)
案例1:
posts
-postID
-title,content,author(userID),createdDate,favoriteCount
favorites
-userID
-favoriteList
-postID(onlyID)
-postID(onlyID)
在这种情况下,例如,当我们需要获得最喜欢的帖子时。
firebase.firestore().collection(`favorites/${userID}/favoriteList`)
.get()
.then((snapshot) => {
snapshot.forEach((favorite) => {
firebase.firestore().collection(`favorites/`).doc(`${favorite.id}`)
.get()
.then((post) => {
myPostList.push(post.data())
});
});
在这种情况下,我们无法按createdDate
订购收藏的帖子。所以,需要对客户端进行排序。即使这样,我们也不会使用limit()函数。
案例2:
posts
-postID
-title,content,author(userID),createdDate,favoriteCount
favorites
-userID
-favoriteList
-postID
-title,content,author(userID),createdDate,favoriteCount
-postID
-title,content,author(userID),createdDate,favoriteCount
firebase.firestore().collection(`favorites/${userID}/favoriteList`).orderBy('createdDate','desc').limit(30)
.get()
.then((snapshot) => {
snapshot.forEach((post) => {
myPostList.push(post.data())
});
});
在这种情况下,当作者修改收藏帖子时, 我们必须更新所有最喜欢的帖子。 (例如,如果100个用户将帖子保存为收藏,我们必须更新为100个数据。)
(我不确定我们可以通过交易增加favoritecount
,完全相同。)
我认为如果我们使用firebase.batch()
,我们就可以管理它。但我认为这似乎效率不高。
似乎两种方式都不完美。你知道这个案子的最佳做法吗?
答案 0 :(得分:1)
使用数组或Collection Groups怎么样?
posts
-postID
-title,content,author(userID),createdDate,favoriteCount
-[favoriters(userID)]
现在,您可以通过查询“数组包含”用户ID的帖子来查询用户的收藏夹。您还可以修改单个帖子,而无需遍历一堆数据副本。
这种方法有一定局限性。文件的最大大小为1 MiB;假设用户ID为4字节,则文档最多可以包含250K个收藏夹。客户还必须执行一些O(N)处理才能添加/删除收藏夹。
posts
-postID
-title,content,author(userID),createdDate,favoriteCount
-favoriters {collection}
-userID
一个集合组由具有相同ID的所有集合组成。默认情况下,查询从数据库中的单个集合检索结果。使用集合组查询可从集合组而不是单个集合中检索文档。
因此,我们可以通过
获取用户喜欢的帖子db.collectionGroup("favoriters").whereEqualTo("userID", <userID>).get()
要收藏一个帖子,我们只需
val postsRef = db.collection("posts")
posts.document(<postID>).collection("favoriters").add({ "userID", <userID> })
答案 1 :(得分:0)
也许不能直接回答你的问题,但官方文档有一个例子:
使用数组,列表和集
摘要:在文档中以类数组结构存储和查询数据。
使用案例:如果您的应用需要复杂的数据对象,如数组, 列表或集合遵循此解决方案中概述的模型。对于 例如,在博客应用程序中,您可能想要创建一组相关的 讯息。