【发布时间】: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 }
...
问题
-
由于我需要显示一个带标记的图标,我将不得不监听数据库更改...我曾考虑监听 /interactions/{userId} 文档中的更改,然后在我的客户端,如果 pendingChatsCount 或pendingPostsInteractionsCount 已更改,请更新标记图标。
-
当用户导航到“点赞”或“评论”屏幕时,他/她将分别看到用户指定帖子的点赞或评论列表。
这两种情况可以用这种结构正确处理吗?或者将 cmets 和 likes 集合放在 /posts/{userId}/userPosts/{postId}/ 中会更好(也可以作为子集合)
Firestore 可以一次执行“多个集合查询”吗?因此,在我的“交互”屏幕中,我可以从按日期排序的不同集合中获取所需的数据
例如,如果我想在交互屏幕中实现拉动刷新,并将其与 onSnapshot 侦听器结合使用,那么这种结构是否是讨论分页的好选择?
总之,基本上我想知道的是,对于我所评论的操作,这是否是一个简单而良好的结构。
Pd:就我而言,我决定以这种方式构建交互,以免在数据库中重复数据,因此,当我进入帖子的点赞屏幕时,我还可以重复使用该集合"interactions/{userId}/posts/{postId/likes/" 读取数据。
如果您有 Firestore 和 NoSQL 数据库方面的一般经验,我将不胜感激。
谢谢。
【问题讨论】:
-
如果您可以进行查询以满足您的应用程序的要求,那么是的,这就足够了。这才是真正重要的。如果它不满足查询,那么您将需要退后一步,仔细定义您的查询,然后构建您的数据以满足它们。 NoSQL 数据建模通常遵循您需要的查询,因此请先定义这些查询。
-
好的,非常感谢你,我会听从你的建议的。我担心这是一个有点疯狂的结构或风格,甚至在设计它们时考虑了要进行的咨询......
-
但是,如果有人对此结构感兴趣或将来可以帮助他们,我不会删除问题。
标签: javascript firebase google-cloud-firestore nosql