在 Firebase 中构建数据的一些好方法是什么?

What are some good ways to structure data in firebase?

我刚开始使用 Firebase,想知道构建数据最有效的方法是什么

让我们以一个简单的社交媒体应用程序为例,其中只能共享照片(就像 Instagram 的开端)。

  1. 用户上传了一张带有一些元数据(描述)的照片

  2. (主页动态)用户(关注者)将按时间顺序看到 post 和offcource会有其他功能,如(喜欢post,保存,评论)

  3. 正在搜索和关注用户

  4. 关于点赞和评论的通知

  5. 在评论中搜索

什么是存储数据的好结构和尽快获取数据的好方法

我会继续并回答我将如何处理这个问题。即使问题被标记为实时数据库,我的回答也将更倾向于 Firestore。有多种方法来构造数据。这是我将在您的示例中使用的一般结构:

users
    - name
    - timestamp

posts
    - imageURL
    - description
    - timestamp
    - likeCount
    - commentCount

posts/comments //subcollection
    - userID
    - comment
    - timestamp
    
posts/likes //subcollection
    - userID
    - timestamp
    
savedposts
    - postID
    - userID

followers
    - userID
    - followedID

一些补充说明:

图片上传

此处最好的选择是将图像上传到云存储并利用云功能生成 public URL 并将其保存到 post 文档中。

评论/用户搜索

如我的评论所述,Firebase 对于基于文本的搜索没有很好的解决方案。我在我的项目中使用的解决方案是利用云函数使 Algolia 索引与我的 users 集合保持同步。然后我通过一个可调用的云函数将用户搜索卸载给他们——尽管如果你愿意,你可以直接在你的应用程序中使用 Algolia 客户端 SDK。在您的场景中,您还必须使所有评论保持同步。 Algolia 不是一项便宜的服务,所以我会研究使用文档中列出的其他选项的优缺点。

文档 ID

我通常让 Firestore 自动识别文件,但在这里我会做一些例外。对于 savedpostsfollowers 集合,我将分别使用 {userID}{postID}{userID}{followedID} 的(手动)化合物 ID。它允许您执行不喜欢和取消关注的简单操作,而无需先查询文档。例如)firestore().collection('postsaves').doc(`${userID}${postID}`).delete()

最后的想法

您提到可能会迁移到 AWS。我在 Firebase 中的工作比在 AWS 中多得多,但我 都做过。在我看来,Firebase 在可用性和文档方面都是无与伦比的。在功能和微调方面有一些妥协,但如果缺乏文本搜索是唯一的障碍,我建议坚持使用 Firebase。