【问题标题】:Firestore structure for users interactions in social media app社交媒体应用中用户交互的 Firestore 结构
【发布时间】:2021-02-12 13:12:01
【问题描述】:

简介

我有一个典型的“互动”屏幕,其中显示了一个无限列表,其中包含在我的一个帖子中喜欢/评论过的用户以及最近发送新消息的用户。此屏幕位于带有“标记图标”(显示新交互的数量)的选项卡导航器中。

此外,我还有另一个名为“消息”的堆栈屏幕,其中显示了新聊天的数量和聊天列表。

为了获得“新交互”和“新聊天”的数量,我考虑过模拟一个堆栈(在我的 Firestore 上推送数据和弹出数据)。

数据库结构

为了处理这个用例,我想像这样构建我的数据库:

/ (root)
|
--> /interactions (collection)
|    |--> /userId (document)
|         |--> pendingPostsInteractionsCount (number) <-------- Always increase. Reset to 0 when the user open the "notifications" screen.
|         |--> pendingChatsCount (number) <-------- Always increase. Decrease when the user open an unread chat.
|         |--> /posts (collection)
|         |     |--> /postId (document)
|         |           |--> /likes (collection)
|         |           |     |--> otherUserId (document)
|         |           |          |--> { date: Date }
|         |           |     ...
|         |           |
|         |           |--> /comments (collection)
|         |                 |--> otherUserId (document)
|         |                      |--> { comment: String, date: Date }
|         |                 ...
|         |              
|         |--> /chats // There are no "groups" in my app
|               |--> otherUserId (document)
|                     |--> messages (collection)
|                          |--> messageId (document)
|                                |--> { text: String, date: Date }
|                          ...
|
|--> /posts (collection)
|    |--> /userId (document)
|          |--> /userPosts (collection)
|               |--> postId (document)
|                     |--> { ...postData }
|               ...
|          ...
|           
|--> /users (collection)
      |--> userId (document)
            |--> { ...userData }
      ...

问题

  1. 由于我需要显示一个带标记的图标,我将不得不监听数据库更改...我曾考虑监听 /interactions/{userId} 文档中的更改,然后在我的客户端,如果 pendingChatsCount 或pendingPostsInteractionsCount 已更改,请更新标记图标。

  2. 当用户导航到“点赞”或“评论”屏幕时,他/她将分别看到用户指定帖子的点赞或评论列表。

这两种情况可以用这种结构正确处理吗?或者将 cmets 和 likes 集合放在 /posts/{userId}/userPosts/{postId}/ 中会更好(也可以作为子集合)

Firestore 可以一次执行“多个集合查询”吗?因此,在我的“交互”屏幕中,我可以从按日期排序的不同集合中获取所需的数据

例如,如果我想在交互屏幕中实现拉动刷新,并将其与 onSnapshot 侦听器结合使用,那么这种结构是否是讨论分页的好选择?

总之,基本上我想知道的是,对于我所评论的操作,这是否是一个简单而良好的结构。

Pd:就我而言,我决定以这种方式构建交互,以免在数据库中重复数据,因此,当我进入帖子的点赞屏幕时,我还可以重复使用该集合"interactions/{userId}/posts/{postId/likes/" 读取数据。

如果您有 Firestore 和 NoSQL 数据库方面的一般经验,我将不胜感激。

谢谢。

【问题讨论】:

  • 如果您可以进行查询以满足您的应用程序的要求,那么是的,这就足够了。这才是真正重要的。如果它不满足查询,那么您将需要退后一步,仔细定义您的查询,然后构建您的数据以满足它们。 NoSQL 数据建模通常遵循您需要的查询,因此请先定义这些查询。
  • 好的,非常感谢你,我会听从你的建议的。我担心这是一个有点疯狂的结构或风格,甚至在设计它们时考虑了要进行的咨询......
  • 但是,如果有人对此结构感兴趣或将来可以帮助他们,我不会删除问题。

标签: javascript firebase google-cloud-firestore nosql


【解决方案1】:

将此作为社区 Wiki 发布,因为 @DougStevenson 对此进行了评论并回答了问题:

如果您可以进行查询以满足您应用的要求,那么是的,这就足够了。 这才是真正重要的。如果它不能满足查询,那么您将需要退后一步,仔细定义您的查询,然后构建您的数据以满足它们。

NoSQL 数据建模通常遵循您需要的查询,因此请先定义这些查询。

【讨论】:

    猜你喜欢
    • 2020-01-22
    • 2023-03-26
    • 2019-04-20
    • 2019-06-10
    • 2011-01-24
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多