【问题标题】:QnA application with flutter: Adding stream of comments [closed]颤振的 QnA 应用程序:添加评论流 [关闭]
【发布时间】:2020-10-13 03:18:00
【问题描述】:
我正在构建一个论坛应用程序,到目前为止,我已将数据结构化为私人帖子(在每个用户下,因为有一个部分供用户仅查看他们的帖子)和公共帖子(在集合“公共”下,以便每个人都可以查看彼此的帖子)。现在我想实现一个评论系统。我应该如何构建数据?我应该在每个 documentid(每个帖子)下创建一个子集合“cmets”还是在 firebase 的用户级别创建一个集合“cmets”?
[![用户等级']
[![收藏下'public']
[![在集合'public'的子集合中,documentid代表该类别下每个帖子的ID(论坛,反馈和笔记)']
【问题讨论】:
标签:
firebase
flutter
dart
google-cloud-firestore
document
【解决方案1】:
这更像是一个基于意见的问题,这意味着有多个解决方案。但是,我的方法与此类似,您可以对其进行修改,或者可能会受到启发以获得更好的解决方案:
- 您必须在每个帖子下添加 2 个附加字段
private (boolean
) 和users (字符串数组)。
- 现在您可以使用Simple queries 查询帖子,例如
postRef.where('private', '==', false); 这将帮助您始终加载非私密帖子。
- 然后您可以使用附加的Array membership 查询私人帖子,例如
postRef.where('private', '==', true).where('users', 'array-contains', 'UID'); 和 UID 是查看论坛页面的当前登录用户的 UID。当您查询此帖子时,您将能够获取所有私人帖子,但只能获取数组中包含用户 UID 的帖子。
- 每个帖子都可以有一个 JSON obj 数组,类似于
{ timestamp: number, comment: string, UID: string }。此字段将帮助您跟踪特定帖子的所有 cmets。但是,能够发布和阅读它们的用户将根据上述字段users和private进行控制。
- 另一方面,如果论坛预计有数千个 cmets,则建议将 cmets 放在单独的数据库中,例如 Realtime Database。您可以将它们结构化为
posts/[POST_ID]/comments/,其中POST_ID 是分配给Firestore 数据库中每个文档的参考。然后在您的帖子下,您可以完全删除它,而不是将 comments 作为 JSON obj 数组。因此,当您将根据上述查询字段查询文档时,API 还将返回文档密钥 (POST_ID),您可以使用它从实时数据库中查询 cmets。如需更多信息,请访问Reading and writing data。
- 此外,您可以在数据库中实施规则,以确保完全限制查询私人帖子的用户的访问权限。这些规则更复杂,更多信息可以在Get started with Cloud Firestore Security Rules 中找到。但是,即使目前没有规则,您也应该没问题。
话虽如此,请记住这是用例场景的众多方法之一,并且可能有更多更好的方法来实现相同的方法。