firebase - 如何在 Firebase 实时数据库中处理所需的关系?
问题描述
本地 SQL
在我的应用程序本地,我有数据模型Foo和Bar,每个都存储在一个单独的 SQL 表中。
Foo 通过它的 引用 Bar id
,如果 Foo 没有它的对应物是错误的:Bar。
有时它们一起显示,有时一次只显示一个,并且可以编辑一个而不影响另一个。
Firebase 实时数据库
我现在正在研究如何最好地将它集成到我的应用程序中,以确保顺畅的同步和备份体验。一切都非常简单。但我无法弄清楚如何确保上述合同保持真实。
会有 Foo 同步的情况;并且 Bar 仅在稍后的某个时间同步(考虑一个简单的网络连接断开)。在此期间,该特定用户的实时数据库将被视为处于非法状态。当连接恢复时, Foo 和 Bar 最终将同步并且整个事情可以继续流动 - 但在那之前我该怎么办?我该如何防范呢?我需要,还是我在所有错误的地方寻找答案?
我一直在探索的一些想法:
- 允许 Bar 在本地丢失。只要 Foo 的 bar 丢失,就认为 Foo 处于部分状态,例如,它可以隐藏在 UI 中,直到它“准备好”。
- 以某种方式在本地组合 Foo 和 Bar,仅在其 Bar 可用时保存 Foo 等。
- Foo 内的 Nest Bar 使得它们总是同步在一起。(这似乎很麻烦,我的应用程序中有几个关系,如 Foo->Bar ,如果这是处理它的“正确”方式,我将不得不将 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,在似乎没有必要的情况下(肯定存在另一种方法来解决问题另一个角度?)。
解决方案
会有 Foo 同步的情况;并且 Bar 仅在稍后的某个时间同步(考虑一个简单的网络连接断开)。
如果两个写入都来自同一个客户端,请考虑使用多路径更新来防止此类部分更新。
推荐阅读
- java - Spock - 模拟私人领域
- jsf - 将 JSF2.2 应用程序从 Glassfish3 升级到 Glassfish5
- delphi-10.3-rio - 解析和转换 JSON
- c# - 如何将 C# 项目与放置在服务器(非本地网络)上的 Access 数据库连接以进行编辑和查看?
- paypal - 集成 Paypal 支付和发票 API
- gatsby - 如何将 AMP Story 添加到 Gatsby 应用程序
- c# - EF Core:在可选外键中将 Guid.Empty 解释为 null
- mongodb - 如何在 Mongo 查询中投影子元素?
- asp.net - asp:Button disabled false for select on click 不起作用
- sql - 不正确的表定义:只能有一个自动列,并且必须定义为键