如何在离线时使用Firebase Cloud函数处理Firestore中的数据非规范化



我想让Firestore中的帐户余额始终保持最新,这取决于子集合中最新的余额文档。

假设我有以下数据库结构:

- accounts (collection)
|
- accountA (document)
|- fields:
|   - name: "account a"
|   - currentBalance: 1000  <----------- This one will be updated by cloud functions
|                                                            ^
|- balances (collection)                                     |
|                                                         |
|- A (document)                                           |
|   - fields:                                             |
|     - balance: 1000   -----------------------------------
|     - date: 10.10.2020
|- B (document)
- fields:
- balance: 500
- date: 09.10.2020

所以我有一个账户集合,里面有账户文件。每个帐户都有一个名称和一个当前余额。

然而,余额并不是直接写入帐户,而是通过云功能更新的。

假设用户在帐户下添加了一个新的余额,日期较新(今天(。

然后,cloud函数检查是否写入余额集合,检查所有文档,获取最新日期的文档,并将余额写入帐户的余额。

这一切都很好,但现在让我们离线。

用户添加了一个日期为2000的新余额,但随后什么也没发生,因为很明显,云功能无法触发。到目前为止,一切都是合理的。


问题

处理这个问题的最佳方法是什么?

  1. 让客户端自动检查最新日期并手动更新余额,然后如果它上线,它只会从云中获取最新数据
  2. 是否有完全不同的数据结构?但数据复制/非规范化似乎是Firestore中的常见情况,离线似乎打破了所有这些逻辑

是否有我不知道的最佳实践,或者我们是否必须在客户端复制所有云功能逻辑,并检查我们是离线还是在线?

问题1

当用户离线时,我不会试图重新计算余额,因为你正在向开放

  1. 愤怒的用户在他们的离线应用程序中看到了与在线时不同的平衡,并会指责你做各种事情。

  2. 用户脱机执行操作然后重新连接可能导致的漏洞利用。

根据您的描述,我的建议是用";(不同步(";如果最后检索到的余额早于最近的交易记录,则显示消息。如果用户需要执行从该平衡中减去的操作,我会使用最后检索到的值作为真理的来源。

问题2

关于数据库结构,你有什么是好的,但我个人更喜欢一个更平坦的结构,你会有:

/accounts
/{accountId}
/ledger
/{txId}
/balances
/{accountId}

原因主要是为了更容易维护,因为很容易删除父集合,而忘记删除其子集合和文档,这将继续无形地增加成本。你的窝越深,情况就越糟。

相关内容

  • 没有找到相关文章

最新更新