我已经追上一个星期了,但是我的后脑勺有个问题:假设我想创建一个Android应用程序,一个待办事项列表。
上下文
为了给出一些上下文,在我的应用程序中,最常用的实体将是Task对象,它包含用户键入的文本、用户id,以及指示任务是否完成的标志。
一个任务也可以属于一个用户定义的类别(object Category),它只有一个标题。
理想情况下,我的防火墙树结构应该是这样的,有两个根级集合。

问题
这个模型的问题是,我的数据确实很小,而且数量可能非常大(一个用户可能会用一个短文本产生许多不同的任务)。
通过这样做,我就会收到很多写作和一些阅读的账单。(也就是说,用户创建任务,编辑标题,将其标记为已完成,但当另一个客户端修改一个任务时,读取就会发生,并且为读过写优化了防火墙)
因此,如果用户有100个任务,那么只包含两个字段的100个文档看起来是错误的。在火药库教程中,文档通常至少包含十几个字段。相比之下,我的小文档需要多次编写,但它们很小,而且我使用的技术在这种场景中感觉被扼杀了。
另外,我不知道该如何从任务中引用类别。如果每个任务都有一个类别,那么没有它的类别对应项,对单个任务的每次读取都是不完整的,这意味着读取的数量是文档的两倍。
为了解决这个问题,我还考虑将这个类别直接嵌入到实际任务中,但是如果用户更改/删除了一个类别,我将不得不对我的所有任务执行一次批写,以编辑/删除被破坏的数据。
因此,我的最后一个问题是:云火药库是否适合这种轻量级数据但编号很重的项目?我的模型是最优的吗?而且,我喜欢用正确的方式进行分类的任务吗?
发布于 2020-01-02 22:15:21
有一个小的文档大小是可以的。如果任务有自己的文档,则更容易查询任务。如果您需要将字段添加到您的Task对象(时间戳等),则为每个任务设置一个单独的文档可以增加项目的可伸缩性。当您希望您的用户能够以不同的方式对任务进行排序和查询时(最近的任务、已完成的任务等等)。
若要引用任务对象中的类别,只需在任务对象中包含一个category字段。这样,您可以使用tasksRef.whereEqualTo("category", "miscellaneous")按类别查询任务。
此外,如果用户只能查看他们自己的任务/类别,最好在用户文档中使用子集合:
- users (collection)
|
- <userId> (document)
|
- tasks (collection)
|
- <taskId> (document)这样,当一个用户只关心他/她的任务时,您就不必从所有用户中查询大型tasks集合。此外,通过这样做,您不必在userId对象中包含Task字段。
https://stackoverflow.com/questions/59569829
复制相似问题