如何在离线时使用 Firebase 云功能处理 Firestore 中的数据反规范化

How to handle data denormalization in Firestore using Firebase Cloud functions when offline

我希望 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

所以我有一个帐户集合,其中包含帐户文档。 每个帐户都有一个名称和当前余额。

但是,余额不是直接写入账户,而是通过云功能更新。

假设用户在帐户下添加新余额,日期更新(今天)。

云函数然后检查写入该余额集合,检查所有文件,获取最新日期的文件,并将该余额写入账户余额。

一切都很好,但是现在让我们去离线

用户添加了一个新的余额,今天是2000年,但是之后没有任何反应,因为很明显,云函数无法触发。到目前为止,一切都说得通了。


问题

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

  1. 让客户端自动应用检查最新日期并手动更新余额,然后如果它上线,它只会从云端获取最新数据?
  2. 完全不同的数据结构?但是后来数据duplication/denormalization似乎是Firestore中的常见情况,离线似乎打破了这一切逻辑。

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

问题 1

当用户离线时,我不会尝试重新计算余额,因为您正在向自己开放:

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

  2. 用户离线执行操作然后重新连接造成的潜在漏洞。

根据您的描述,我的建议是,如果最后检索到的余额早于最新交易,则将余额显示为灰色并显示“(不同步)”消息。如果用户需要执行会从该余额中减去的操作,我会使用最后检索到的值作为真实来源。

问题二

关于您拥有的数据库结构很好,但我个人更喜欢您拥有的更扁平的结构:

/accounts
  /{accountId}

/ledger
  /{txId}

/balances
  /{accountId}

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