我正在 firestore 中构建一个任务管理应用程序。 任务
可以有多个成员
和标签
。由于我总是对用户的内容进行排序和显示(基于截止日期、优先级等),并且由于带有列表和复合索引的 firestore 的限制,我最终将数据存储在以下结构中。
projects:
.....
101: {
name: 'task1',
members: {201: true, 202: true, ......},
tags:{'tag1':true, 'tag2':true, 'tag3':true,....}
},
102: {
name: 'task2',
members: {201: true, 202: true, ......},
tags:{'tag1':true, 'tag2':true, 'tag3':true,....}
},
103: {
name: 'task3',
members: {201: true, 202: true, ......},
tags:{'tag1':true, 'tag2':true, 'tag3':true,....}
}
.....
现在,由于复合索引必须是手动的,我最终实现了反向查找:
users:
.....
201: {
name: 'John',
tasks:
501: {taskId: 601, priority: high, ...... },
502: {taskId: 601, priority: high, ...... },
503: {taskId: 601, priority: high, ...... },
}
202: {
name: 'Doe',
tasks:
504: {taskId: 601, priority: high, ...... },
505: {taskId: 601, priority: high, ...... },
506: {taskId: 601, priority: high, ...... },
}
......
此时,如果您也必须过滤标签
,在用户下,我将必须为每个标签添加子集合并在它们下存储任务。这将为每项任务创建大量文档。例如,如果您的一项任务包含 3 个成员和 3 个标签,则此设置将为一项任务创建 12 个文档。我所做的任何更改都将涉及 12 次写入。
我在这里缺少什么?这是我存储数据的方式吗?还是与firestore本身能力不足有关?
最佳答案
Firestore 在查询方面确实存在限制
我看到的是,您正在尝试标准化数据,如果您使用 RDBMS,这是一个很好的方法。在 Firestore 中,通常建议尽可能对数据进行非规范化。但这又是一个权衡,您的读取速度将很快且易于查询,但写入速度可能会很慢,因为您可能必须在多个位置写入数据。
反规范化 - 简而言之,它具有扁平的数据结构
读得好 - https://angularfirebase.com/lessons/firestore-nosql-data-modeling-by-example/
关于firebase - 使用 Firestore 进行过滤和排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51558035/