Google cloud firestore 为深度嵌套的一组类似电子表格的对象构建Firestore数据库的建议方法

Google cloud firestore 为深度嵌套的一组类似电子表格的对象构建Firestore数据库的建议方法,google-cloud-firestore,Google Cloud Firestore,我的应用程序用于为复杂项目(建筑、媒体制作等)创建生产预算 预算结构如下: 预算包含“部分”, 这些部分包含“账户” 账户包含“子账户” 子帐户包含行项目。 行项目有多个字段(单位、汇率、货币、税收等)和计算总数 或者使用Firestore进行这些级联计算是错误的方法?我应该将一个复杂的预算文档加载到我的应用程序中,对客户端执行所有计算和更新,然后在用户按“保存预算”时将整个预算作为一个文档写回 行项目中的某些字段可能具有表示数值的字母数字代码,用户可以使用该代码来代替硬编码数字,例如,用户可以

我的应用程序用于为复杂项目(建筑、媒体制作等)创建生产预算

预算结构如下: 预算包含“部分”, 这些部分包含“账户” 账户包含“子账户” 子帐户包含行项目。 行项目有多个字段(单位、汇率、货币、税收等)和计算总数

或者使用Firestore进行这些级联计算是错误的方法?我应该将一个复杂的预算文档加载到我的应用程序中,对客户端执行所有计算和更新,然后在用户按“保存预算”时将整个预算作为一个文档写回

行项目中的某些字段可能具有表示数值的字母数字代码,用户可以使用该代码来代替硬编码数字,例如,用户可以输入“=构建周”,并使用计算结果为“7”的公式来定义,然后在计算总额时使用该公式

行项目将其合计冒泡出来,因此子帐户的合计等于其行项目的总和, 账户合计等于其子账户的合计, 部分合计等于科目合计的总和, 预算总额是各部分总额的总和

问题是如何将这些数据汇总到构成预算的文件中。 预算可能有点长,比如说总共5000个线路站点或更多。单个帐户可能有数百个行项目

用户很可能会查看给定帐户的所有行项目,所以我想到了这一点 为部门、科目和子科目生成单独的文档,并在子科目中生成行项目映射

这种方法的主要问题是,当用户更改时,例如行项目的货币汇率,或更改命名值(如“build weeks”)的计算值时,我需要检索包含当前值或命名值的所有行项目,重新计算总数,然后通过层次结构将更改冒泡出来

如果每个行项目都是它自己的文档,那么这似乎没有那么复杂,我可以搜索集合中存在问题的代码,重新计算行项目,并使用云函数冒泡出可能的更改

但如果所有行项目都包含在每个子帐户映射项目内的映射数组中, 在必要时找到并更改它们似乎是相当乏味的

另一方面--当有人在审查预算,或者说打印预算时,如果有人只是点击一堆账户,那么将这些文档保持在如此小的范围内似乎需要大量的文档阅读,当有人更改常用命名值(如“build weeks”)的值时,每次单击可能会有100次读取以检索所有行项目和数百次或1000次写入


有人对这个显而易见的“正确”答案有什么想法吗?或者这仅仅取决于我想优化什么——firestore成本、应用程序的响应能力、代码的复杂性?

从我的观点来看,你的问题没有明显的答案,事实上,这取决于你想优化什么

但是在你的决定中需要考虑的几个方面:

  • Firestore中的文档限制为1Mb/文档

  • Firestore中的文档限制为20000个字段

  • 查询很浅,因此您不会从同一查询的子集合中获取数据

考虑到1和2,这意味着,如果你将数据库的设计选择为包含所有内容的大文档,即使你说你的应用程序将有大量的数据,我怀疑它会超过所提到的限制,但是,还是要考虑这些。此外,一次获取所有数据的必要性有多大,这可能代表性能和用户电池/数据使用问题(如果您正在制作移动应用程序)

考虑到第3点,这意味着如果您选择将各节的所有数据划分为子文档,则必须进行多次读取,这将意味着您的成本更高,但用户的性能更好

要对此问题做出正确的判断,我建议您与解决方案的可能用户交谈,了解您试图解决的问题以及他们对应用程序的期望。另外,看一看这些和视频可能会很有趣,因为它们以更直观的方式解释Firestore的行为,这可能有助于提前解决您选择的方法可能导致的问题

希望我能在这些方面提供帮助