firestore数据结构的最佳实践是什么?

时间:2018-02-06 20:24:06

标签: javascript firebase react-native nosql google-cloud-firestore

我正在使用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(),我们就可以管理它。但我认为这似乎效率不高。

似乎两种方式都不完美。你知道这个案子的最佳做法吗?

2 个答案:

答案 0 :(得分:1)

使用数组或Collection Groups怎么样?

解决方案1:数组

posts
  -postID
   -title,content,author(userID),createdDate,favoriteCount
  -[favoriters(userID)]

现在,您可以通过查询“数​​组包含”用户ID的帖子来查询用户的收藏夹。您还可以修改单个帖子,而无需遍历一堆数据副本。

这种方法有一定局限性。文件的最大大小为1 MiB;假设用户ID为4字节,则文档最多可以包含250K个收藏夹。客户还必须执行一些O(N)处理才能添加/删除收藏夹。

解决方案2:Collection Groups

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)

也许不能直接回答你的问题,但官方文档有一个例子:

  

使用数组,列表和集

     

摘要:在文档中以类数组结构存储和查询数据。

     

使用案例:如果您的应用需要复杂的数据对象,如数组,   列表或集合遵循此解决方案中概述的模型。对于   例如,在博客应用程序中,您可能想要创建一组相关的   讯息。

https://firebase.google.com/docs/firestore/solutions/arrays