在Firestore

时间:2017-10-13 07:46:51

标签: database firebase nosql data-modeling google-cloud-firestore

最近我将我的数据模型从Firebase移到了Firestore。我的所有代码都正常工作,但是我的嵌套查询有一些丑陋的问题需要检索一些数据。以下是重点:

现在我的这个部分的数据模型看起来像这样(是的!另一个粉丝/饲料示例):

{
  "Users": { //Collection
    "UserId1" : { //Document
      "Feed" : { //Subcollection of Id of posts from users this user Follow
        "PostId1" : { //Document
          "timeStamp" : "SomeDate"
        },
        "PostId2" : {
          "timeStamp" : "SomeDate"
        },
        "PostId3" : {
          "timeStamp" : "SomeDate"
        }
      }
      //Some data
    }
  },
  "Posts":{ //Collection
    "PostId1":{ //Document
      "Comments" :{ //Subcollection
        "commentId" : { //Document
          "authorId": "UserId1"
          //comentsData
        }
      },
      "Likes" : { //Subcollection
        "UserId1" : { //Document
          "liked" : true
        }       
      }
    }
  }
}

我的问题是,要检索用户的Feed的帖子,我应该以下一个方式查询:

  • 通过我的Feed
  • 中的timeStamp获取最后一个X文档订购者

feedCol(userId).orderBy(CREATION_DATE, Query.Direction.DESCENDING).limit(limit)

  • 之后我应该对从列表中检索到的每个帖子进行一次查询:workoutPostCol.document(postId)

  • 现在我有每个帖子的数据,但是我想拍摄作者的用户名,图片,分数等等,这是另一个Document,所以,我再次做另一个在帖子列表authorId

  • 中检索到的每个userSocial(userId).document(toId)的单个查询
  • 最后,同样重要的是,我需要知道我当前的用户是否已经喜欢该帖子,所以我需要对每个帖子进行一次查询(再次)并检查我的userId是否在{{1 }}

现在一切正常,但认为posts/likes/{userId}的价格取决于数据库调用的数量,而且它不会使我的查询更简单,我不知道它是否只是我的数据模型不适合这种数据库,我应该转为正常Firestore或者再次回到SQL

注意:我知道一切都会更容易将喜欢,提要等子集合移动到我的用户或发布文档中的arraylists,但文档的限制是 1MB 如果这个增长很多,它将来会崩溃。另一方面,Firebase不允许使用多个Firestore的子文档查询(尚未)或OR子句。

我已经阅读了许多用户的帖子,他们在寻找一种简单的方法来存储这种whereEqualTo关系时,会在ID'sjoinsqueries使用Collections会很棒,但是1MB的限制会限制它。

希望有人能够澄清这一点,或者至少教会我一些新东西;也许我的模型只是垃圾,有一个简单,最简单的方法吗?或许我的模型不适用于非SQL数据库。

1 个答案:

答案 0 :(得分:18)

不是100%确定这是否完全解决了问题,因为您的使用可能存在边缘情况。但是通过5分钟的快速思考,我觉得以下内容可以解决您的问题:

您可以考虑使用类似于Instagram的模型。如果我的记忆很好,他们使用的是基于events的集合。在此特定上下文中,events表示用户采取的所有操作。因此,comment是一个事件,like是一个事件等。

这样就可以让你总共需要三个主要的收藏品。

users
-- userID1
---- userdata (profile pic, bio etc.)
---- postsByUser : [postID1, postID2]
---- followedBy : [userID2, ... ]
---- following : [userID2, ... ]
-- userID2
---- userdata (profile pic, bio etc.)


posts
-- postID1 (timestamp, so it's sortable)
---- contents
---- author : userID1
---- authorPic : authorPicUrl
---- authorPoints : 12345
---- taggedUsers : []
---- comments
------ comment1 : { copy of comment event }
---- likes : [userID1, userID2]
-- postID2 (timestamp)
---- contents
... 


events
-- eventID1
---- type : comment
---- timestamp
---- byWhom : userID
---- toWhichPost : postID
---- contents : comment-text
-- eventID2
---- type : like
---- timestamp
---- byWhom : userID
---- toWhichPost : postID

对于您的用户生物页面,您将查询users

对于新闻Feed,您可以在最近1天(或任何给定的时间段)内按用户ID跟踪的所有帖子查询posts

对于活动供稿页面(评论/喜欢等),您将查询与您的用户ID相关的events,该ID仅限于过去1天(或任何给定的时间跨度)

最后在用户滚动时查询帖子/事件的下一天(或者在那些日子里没有新活动)

同样,这只是一个简单的想法,我知道SOF的长老通常习惯将这些钉在十字架上,所以如果这个答案有缺陷,请原谅我SOF的成员:)

希望它有助于Francisco,

祝你好运!