首页 > 解决方案 > 如何在 Firebase 实时数据库中处理所需的关系?

问题描述

本地 SQL

在我的应用程序本地,我有数据模型FooBar,每个都存储在一个单独的 SQL 表中。

Foo 通过它的 引用 Bar id,如果 Foo 没有它的对应物是错误的:Bar。

有时它们一起显示,有时一次只显示一个,并且可以编辑一个而不影响另一个。

Firebase 实时数据库

我现在正在研究如何最好地将它集成到我的应用程序中,以确保顺畅的同步和备份体验。一切都非常简单。但我无法弄清楚如何确保上述合同保持真实。

会有 Foo 同步的情况;并且 Bar 仅在稍后的某个时间同步(考虑一个简单的网络连接断开)。在此期间,该特定用户的实时数据库将被视为处于非法状态。当连接恢复时, Foo 和 Bar 最终将同步并且整个事情可以继续流动 - 但在那之前我该怎么办?我该如何防范呢?我需要,还是我在所有错误的地方寻找答案?

我一直在探索的一些想法:

如果可以的话,请赐教。Firebase 对我来说并不陌生,但是将这种复杂的数据与多种关系同步,却是。

附加上下文

虽然我不能分享实际的 Foo & Bar,但我有一个我认为与挑战非常相似的示例。

考虑一个有消息、房间和用户的聊天应用程序。

您可以向房间发布消息,也可以编辑房间名称和颜色。没有用户和房间,消息就无法存在。从同步的角度来看,用户、房间和消息现在必须“一起”同步(或者至少,如果没有其他消息通过,消息将是无效的)。

使用多路径更新处理此问题,每次发布/编辑消息时,我都会更新所有 3 个。我是否正确理解了这一点?如果是这样,那将意味着在我自己的场景中更新 1+N+N 个节点。N+N 个节点不会有任何实际更新的数据,但会包含在更新中以确保所有数据同步在一起。

进一步明确

首先,回到问题的根源——Foo 在本地通过它的 id 引用 Bar。如果我的应用程序最终处于一个没有另一个存在的状态,那么它几乎会在任何地方引起问题(这就是我所说的非法状态,它不会发生)。

考虑到防止它的方法,建议我在 firebase 中使用多路径更新(我相信这与扇出相似/相同?)。我很快就会尝试这种方法,即使我对此感到保留,只是为了验证我的感受是否只是缺乏经验。

我很难理解这样一个事实,即如果 Foo 在本地发生变化,现在也会导致对 Bar 进行查询,这样两者都可以同步到 firebase。对于这样一个简单的场景,这听起来不错,但在实践中,这意味着:您对 X 进行编辑并保存在本地,此后不久将同步到 firebase,现在 Y 和 Z 为 100:s也被查询,并在同一操作中插入到 firebase。此时,Y & Z 可能已经在 firebase 中保持最新状态,并且它们在本地没有更改。

当涉及到 firebase 时,我对这类场景没有太多经验,我的想法是这样的,这是对资源的巨大浪费——我确信 firebase 在本地做了很多工作,这样就不会发生不必要的同步工作。实际上并没有改变,但我无法逃避这样的想法,即我仍然会在本地大量查询复杂模型的 100:s 和 100:s,在似乎没有必要的情况下(肯定存在另一种方法来解决问题另一个角度?)。

标签: firebasefirebase-realtime-database

解决方案


会有 Foo 同步的情况;并且 Bar 仅在稍后的某个时间同步(考虑一个简单的网络连接断开)。

如果两个写入都来自同一个客户端,请考虑使用多路径更新来防止此类部分更新。


推荐阅读