在firebase/firestore中构建相关数据并管理更新的最佳方法?

在firebase/firestore中构建相关数据并管理更新的最佳方法?,firebase,nosql,google-cloud-firestore,Firebase,Nosql,Google Cloud Firestore,如果我有User和Profile对象。考虑到以下情况,在firestore中构建我的收藏的最佳方式是什么 用户只有一个配置文件 用户可以更新他们的个人资料 用户可以保存其他用户的配置文件 用户可以删除其保存的配置文件 同一配置文件不能保存两次 如果用户和配置文件是独立的集合,那么存储保存的配置文件的最佳方式是什么 想到的一种方法是,每个用户都有一个子集合,名为SavedProfiles。每个文档的id都是配置文件的id。每个保存的配置文件仅包含对其所属配置文件的用户的引用 另一个选项是执行相同的

如果我有
User
Profile
对象。考虑到以下情况,在firestore中构建我的收藏的最佳方式是什么

  • 用户只有一个配置文件
  • 用户可以更新他们的个人资料
  • 用户可以保存其他用户的配置文件
  • 用户可以删除其保存的配置文件
  • 同一配置文件不能保存两次
  • 如果用户和配置文件是独立的集合,那么存储保存的配置文件的最佳方式是什么

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

    另一个选项是执行相同的操作,但存储每个已保存配置文件的整个配置文件

    第一种方法的好处是,当用户更新自己的配置文件时,不需要更新任何已经保存的配置文件,因为存储的只是引用。但是,尝试读取用户保存的配置文件可能需要两次读取操作(通常是这样),一次获取所有引用,然后查询所有具有这些引用的配置文件(如果可能的话??)。这似乎很贵

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

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


    谢谢。

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

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

    第一个选项需要多次访问数据库。这实际上取决于你计划如何扩展它,以及你希望你的应用程序运行得有多快


    选项1将是一个缓慢的用户体验,而所有的数据都被提取。选项2将是一个更快的用户体验,但将要求您的云功能更新每个保存的配置文件。但是,这是一项后台任务,因此,如果需要几秒钟的时间,这并不重要。

    谢谢,但我如何检查每个用户并找到要更新的特定保存的配置文件?这不是非常慢吗(10000/100000用户)?firestore是否为在多个“随机”位置更新相同的值提供了更快/更简单的方法?据推测,一个用户不会被100000个其他用户喜欢。我假设某个人可能被<100个用户“喜欢”。在这种情况下,您将创建一个函数,用于从用户链接到另一个用户的
    profiles
    集合中获取所有文档。使用forEach将更新添加到批,然后提交批。查看我的答案,了解如何构造数据和查询