【问题标题】:Cloud Firestore model organization with small entities具有小型实体的 Cloud Firestore 模型组织
【发布时间】:2020-01-02 20:49:54
【问题描述】:

我已经在 firebase firestore 上赶上一周了,但我的脑海中有一个问题:假设我想创建一个 Android 应用程序,一个待办事项列表。

上下文

为了提供一些上下文,在我的应用程序中,最常用的实体是 Task 对象,它包含用户输入的文本、用户 ID,可能还有一个标志,指示任务是否完成。

一个任务也可以属于一个用户定义的类别,(对象Category),它只有一个标题。

我的 Firestore 树结构理想情况下应该是这样的,有 2 个根级集合

问题

这个模型的问题是我的数据真的很小,而且数量可能非常大(一个用户可能会用很短的文本产生很多不同的任务)。

这样做,我会为大量写入和少量读取付费。 (即用户创建任务,编辑标题,将其标记为已完成,但读取只是在另一个客户端修改任务时发生,并且 firestore 针对读写进行了优化)

因此,如果用户有 100 个任务,那么 100 个文档中只有几个字段看起来是错误的。 在 Firestore 教程中,一个文档通常包含至少十几个字段。相比之下,我的小文档必须编写很多次,但它们很小,而且我使用的技术对于这种情况来说感觉有点过头了。

另外,我不知道应该如何从任务中引用类别。 如果每个任务都有一个类别,那么如果没有对应的类别,对单个任务的每次读取都将是不完整的,这意味着阅读量是文档的两倍。

为了解决这个问题,我还考虑过将类别直接嵌入到实际任务中,但是如果用户更改/删除一个类别,我必须对我的所有任务执行批量写入以编辑/删除士气低落的数据剩菜。

所以我的最后一个问题是:Cloud Firestore 是否适合这种轻数据但数量众多的项目?我的模型是最佳模型吗?而且,我是否喜欢以正确方式分类的任务?

【问题讨论】:

    标签: android firebase google-cloud-firestore nosql


    【解决方案1】:

    可以使用较小的文档大小。如果任务有自己的文档,则更容易查询任务。如果您希望用户能够以不同方式排序和查询任务(最近的任务、已完成的任务等...)。

    要在任务对象中引用类别,您只需在任务对象中包含 category 字段即可。这样,您可以使用tasksRef.whereEqualTo("category", "miscellaneous")按类别查询任务。

    此外,如果您的用户只能查看他们自己的任务/类别,那么在您的用户文档中使用子集合可能会更好:

    - users (collection)
      |
      - <userId> (document)
        | 
        - tasks (collection)
          |
          - <taskId> (document)
    

    这样,当一个用户只关心他/她的任务时,您不必在 所有 用户的大型 tasks 集合中进行查询。此外,通过这种方式,您不必在 Task 对象中包含 userId 字段。

    【讨论】:

      猜你喜欢
      • 2020-05-19
      • 1970-01-01
      • 2010-12-09
      • 2010-09-22
      • 2010-10-09
      • 1970-01-01
      • 1970-01-01
      • 2019-03-19
      • 2014-04-21
      相关资源
      最近更新 更多