我想让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的新余额,但随后什么也没发生,因为很明显,云功能无法触发。到目前为止,一切都是合理的。
问题
处理这个问题的最佳方法是什么?
- 让客户端自动检查最新日期并手动更新余额,然后如果它上线,它只会从云中获取最新数据
- 是否有完全不同的数据结构?但数据复制/非规范化似乎是Firestore中的常见情况,离线似乎打破了所有这些逻辑
是否有我不知道的最佳实践,或者我们是否必须在客户端复制所有云功能逻辑,并检查我们是离线还是在线?
问题1
当用户离线时,我不会试图重新计算余额,因为你正在向开放
-
愤怒的用户在他们的离线应用程序中看到了与在线时不同的平衡,并会指责你做各种事情。
-
用户脱机执行操作然后重新连接可能导致的漏洞利用。
根据您的描述,我的建议是用";(不同步(";如果最后检索到的余额早于最近的交易记录,则显示消息。如果用户需要执行从该平衡中减去的操作,我会使用最后检索到的值作为真理的来源。
问题2
关于数据库结构,你有什么是好的,但我个人更喜欢一个更平坦的结构,你会有:
/accounts
/{accountId}
/ledger
/{txId}
/balances
/{accountId}
原因主要是为了更容易维护,因为很容易删除父集合,而忘记删除其子集合和文档,这将继续无形地增加成本。你的窝越深,情况就越糟。