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

时间:2018-02-07 16:33:18

标签: firebase nosql google-cloud-firestore

如果我有UserProfile个对象。考虑到可以进行以下场景,在firestore中构建我的集合的最佳方法是什么?

  1. 用户只有一个个人资料
  2. 用户可以更新其个人资料
  3. 用户可以保存其他用户的个人资料
  4. 用户可以删除已保存的个人资料
  5. 相同的个人资料无法保存两次
  6. 如果用户和配置文件是单独的集合,那么存储已保存配置文件的最佳方法是什么?

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

    另一个选择是做同样的事情,但存储每个保存的个人资料的整个个人资料。

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

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

    请提供一些如何获取和更新个人资料/已保存个人资料的示例。

    谢谢。

1 个答案:

答案 0 :(得分:2)

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

正如您所确定的那样,使用第二种方案查询会更容易。您可以轻松创建云功能,以更新已修改的任何配置文件。

您的第一个选项需要多次访问数据库。这实际上取决于您计划如何扩展此规模以及您希望应用程序的运行速度。

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