firebase Firestore:如何保持用户和拥有用户信息的文档之间的数据一致?

8xiog9wr  于 2023-08-07  发布在  其他
关注(0)|答案(2)|浏览(127)

摘要

我如何在Firebase中建模我的数据库,以保持,例如,在特定页面中的评论与用户信息更新,这就是说,如果用户改变了它的头像或名称,评论也应该显示用户的更新数据。我大部分时间都在使用MongoDB,Mongoose,现在我正在使用Firebase开发一个移动的应用程序。在Mongo中,我只需要在评论中存储一个用户的引用,然后填充字段以从文档中检索我想要的数据。Firebase中是否有类似的东西,它甚至是一个好的或可接受的实践?

快速提问

  1. Firebase中是否有类似“.populate()”的东西?
    1.我是否应该尽可能多地对文档进行建模,以使其具有view中将要使用的数据,并避免“连接”?

示例

我们有一个用户集合,和一个商店集合与评论在它。
据我所知,您应该最小化doc读取,因此我们应该使用view所需的特定值来建模数据,这样我们只需要执行一次查询。

为了简化起见,我们假设:

用户有姓名、电子邮件、头像

users: {
    user_id_1: {
        email: "user1@gmail.com",
        name: "John Doe",
        avatar: "some_firestore_url"
    }
}

字符串
商店收藏应:
1.有嵌套的评论集合像这样

stores: {
    store_id_1: {
        name: "Dat Cool Store!",
        reviews: {
            user_id_1: {
                name: "John Doe",
                avatar: "some_firestore_url",
                text: "Great store love it!",
                timestamp: "May 07, 2020 at 03:30"
            }
        }
    }
}


我看到的问题是,除非我们使用一个函数来更新每个文档中的每个字段,否则没有其他方法来更新名称和头像中的数据。
1.在字段中设置user_id,然后在以下位置查询用户信息:

stores: {
    store_id_1: {
        name: "Dat Cool Store!",
        reviews: {
            review_id_1: {
                user: "user_id_1",
                text: "Great store love it!",
                timestamp: "May 07, 2020 at 03:30"
            }
        }
    }
}


这就是我在MongoDB中的模仿方式。
抱歉,如果有些听起来很混乱,或者我没有用最好的方式解释自己,但现在是凌晨4点,我只是想让它正确:)

tsm1rwdh

tsm1rwdh1#

我如何在Firebase中建模我的数据库,以保持,例如,在特定页面中的评论与用户的信息更新,这就是说,如果用户更改了其头像或名称,评论也应该显示用户的更新数据。
如果不知道要执行的查询,就很难提供可行的模式。我们通常根据我们想要执行的查询来构建Firestore数据库。
在Mongo中,我只需要在评论中存储一个用户的引用,然后填充字段以从文档中检索我想要的数据。Firebase中是否有类似的东西,它甚至是一个好的或可接受的实践?
是的,有。根据有关Firestore supported data-types的官方文档,DocumentReference是其中之一,这意味着您只能存储文档的路径,而不是整个文档。在NoSQL世界中,复制数据是很常见的,因此在多个地方拥有相同的数据。同样,在不知道应用程序的用例的情况下,很难说使用规范化是否比只保存引用更好。为了更好地理解,我建议你阅读下面文章中的答案:

回答你们的问题:

  1. Firebase中是否有类似“.populate()”的东西?
    如果只存储DocumentReference,并不意味着引用所指向的文档数据将自动填充。不,首先需要从文档中获取引用,然后基于该引用,必须执行另一个数据库调用,以实际从引用的文档中获取数据。
    1.我是否应该尽可能多地对文档建模,以获得将在视图中使用的数据,并避免“连接”?
    是的,您应该只存储实际需要在视图中显示的数据。关于JOIN子句,Firestore中不支持类似的内容。查询一次只能获取单个集合中的文档。例如,如果您希望从两个集合中获取数据,则至少需要执行两个查询。
    另一种解决方案是添加第三个集合,其中包含已经从两个集合合并的数据,以便您可以执行单个查询。这在上面的链接中已经解释过了。
    其他一些可能有用的信息在我的回答中解释了以下帖子:

您可以在其中找到将数据保存到文档、集合或子集合的最佳实践。

cx6n0qe3

cx6n0qe32#

对我来说,构建json集合的方式也取决于我试图存储在集合中的数据的大小。
让我们说的用户数量如果小,我只想支持一个thousand用户。在这种情况下,我可以使用这个结构。

{
  "store_id_1": {
    "name": "Dat Cool Store!",
    "reviews": [
      {
        "user_id_1": {
          "name": "John Doe",
          "avatar": "some_firestore_url"
        },
        "text": "Great store love it!",
        "timestamp": "May 07, 2020 at 03:30"
      },
      {
        "user_id_2": {
          "name": "John Doe 2",
          "avatar": "some_firestore_url 2"
        },
        "text": "Great store love it! TWO",
        "timestamp": "May 27, 2020 at 03:30"
      }
    ]
  }
}

字符串
现在,您可以将所有用户信息嵌入到stores集合中。这也会减少你的阅读量。
但是如果你想扩展它,那么,我建议你只存储users元数据,然后再从users集合中读取一次。
希望这对你有帮助!

相关问题