【问题标题】:Best way to structure related data in firebase/firestore and manage updates?在 firebase/firestore 中构建相关数据并管理更新的最佳方式?
【发布时间】:2018-02-07 16:33:18
【问题描述】:

如果我有 UserProfile 对象。鉴于可能发生以下情况,在 Firestore 中构建我的收藏的最佳方式是什么?

  1. 用户只有一个个人资料
  2. 用户可以更新他们的个人资料
  3. 用户可以保存其他用户的个人资料
  4. 用户可以删除他们保存的个人资料
  5. 同一个人资料不能保存两次

如果用户和配置文件是单独的集合,那么存储已保存配置文件的最佳方式是什么?

想到的一种方法是每个用户都有一个名为SavedProfiles 的子集合。每个文档的 id 是配置文件的 id。每个已保存的个人资料仅包含对其所属个人资料的用户的引用。

另一种选择是做同样的事情,但存储每个已保存配置文件的整个配置文件。

第一种方法的好处是,当用户更新他们自己的个人资料时,无需更新他们已保存的任何个人资料,因为它只是存储的参考。但是,尝试读取用户保存的配置文件可能需要两次读取操作(这很常见),一个是获取所有引用,然后使用这些引用查询所有配置文件(如果这可能吗???)。这似乎相当昂贵。

第二种方法似乎是正确的方法,因为它解决了读取所有已保存配置文件的问题。但是更新多个保存的配置文件似乎是一个问题,因为每个用户保存的配置文件可能是唯一的。我知道可以进行批量更新,但是是否有必要查询数据库中的每个用户以获取他们保存的配置文件并检查更新的配置文件是否存在,如果存在则更新它?我不太确定该走哪条路。我不太习惯 NoSQL 数据结构,而且似乎我做错了什么,因为我使用了子集合,因为建议尽可能保持一切非规范化,所以如果结构对我的整体来说,请告诉我db也是错的,这也是很有可能的……

请提供一些示例,说明如何获取和更新配置文件/保存的配置文件。

谢谢。

【问题讨论】:

    标签: firebase nosql google-cloud-firestore


    【解决方案1】:

    欢迎来到设计 NoSQL 数据库的难题。这里没有正确或错误的答案。这是最适合你的。

    正如您所确定的,使用第二个选项进行查询会容易得多。您可以轻松创建一个云函数来更新任何已修改的配置文件。

    您的第一个选项将需要多次获取数据库。这实际上取决于您计划如何扩展它以及您希望您的应用运行多快。

    选项 1 会导致用户体验缓慢,同时会获取所有数据。选项 2 将提供更快的用户体验,但需要您的 Cloud Function 更新每个已保存的配置文件。但是,这是一项后台任务,因此即使需要几秒钟也无所谓。

    【讨论】:

    • 谢谢,但我将如何遍历每个用户并找到要更新的特定已保存配置文件?那会不会非常慢(10,000/100,000 个用户)? Firestore 是否提供了一种更快/更简单的方法来更新多个“随机”位置的相同值?
    • 假设一个用户不会被 100,000 个其他用户点赞。我假设某人可能被 profiles 集合中获取所有文档。使用 forEach 将更新添加到批次,然后提交该批次。请参阅我的回答 here 了解如何构建数据和查询
    猜你喜欢
    • 1970-01-01
    • 2020-01-21
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 2017-06-21
    相关资源
    最近更新 更多