Firestore 联系人列表数据模型

Firestore contacts list data model

我正在为本地团体开发管理应用程序。
该应用程序还会显示每个群组的联系人列表。

我想知道我应该如何设计我的数据库?

如果我将所有用户存储在根级集合中,则每次用户打开联系人列表时,它都会读取其所在组的所有用户的文档。例如,假设有 1000 个联系人组,对于这样一个简单的任务,总计有很多读取。
为组使用子集合也是如此。
将组的联系人作为地图存储在组的文档中是不可缩放的。
在组文档中使用映射来索引非规范化模型中的集合或子集合也是如此。

这就是我卡住的地方。
我是否遗漏了什么,或者这些是我拥有的选项,我需要在每次用户打开联系人列表时进行大量读取和为有限规模的组设计的模型之间做出选择?

我认为这是一种常见的情况。许多项与较少的父项相关,我们想显示父项的子项。

对于 Firestore,建议您限制查询。

例如,如果用户想查看群组的联系人列表,可以进行查询。但不要一次显示所有 1000 多个联系人。甚至 Facebook 也不会这样做(转到 Facebook 群组并单击“成员”,你只会看到一打左右,当你向下滚动时,会进行更多查询以向你展示更多。)

用户期望这种行为:延迟加载或分页。

Firestore 文档 limit/paginate 查询:limit, paginate

这样,群组可以是文档,而联系人可以是具有包含其所属群组 ID 的数组字段的文档。要显示组的联系人,您可以对联系人集合使用“array-contains”查询。

像这样

contacts (collection)
   |
   --- {contactId} (document)
      |
      --- (...contact data...)
      |
      --- group_membership (array)
          |
          0--- 'groupId111'
          |
          1--- 'groupId222'

(对于 contacts(col)/contact(doc)/group_membership(field) 我假设一个联系人可以属于多个组,如果不是这样的话,该字段可以是一个字符串而不是数组,但将其设为数组更安全,以防您改变主意。)

我要说的是,您对数据库结构的看法很好而且很普遍,您不必为了避免查询一千个联系文档而进行重组...因为您不必.您不必查询最终用户实际需要的数据量的 100 倍。