Firebase 高级查询

Orl*_*ter 1 firebase firebase-realtime-database

我知道这是一个讨论度很高的话题,但对我来说,仍然不清楚哪种方法是在 Firebase 中创建高级查询的最佳方法。

目前,我在应用引擎的前端使用 Angular 2,后端使用 Firebase + NodeJS(Admin SDK)。

前端:身份验证/简单查询/写入非敏感数据

NodeJS:编写高敏感数据/验证

工作得很好!

但现在我想创建高级查询,这就是我挣扎的地方:

  • Firebase 的内置查询不够强大
  • 出于性能原因,客户端太糟糕了。
  • 服务器端也一样。无论如何,我需要将所有未查询的数据传输到我的服务器。

那么有没有什么好的方法可以避免传输未查询的数据呢?也许因为我无论如何都在使用 gcloud 作为管理 sdk?

我真的很想念自定义端点之类的东西。

提前谢谢!

xxf*_*ast 6

Google 对“为什么不能进行高级查询”的回答 只是“重组您的数据,因此您无需进行高级查询”

这似乎是一个廉价的裁剪,但这个想法是因为 firebase 应该是实时的,它需要尽可能快地查询数据,并且可能没有足够的“时间”/“资源”来为高级查询提供服务. 从 google 的角度来看,这是有道理的,因为他们不能简单地将更多的服务器资源专供您使用。在谷歌看来,这很简单,“我们在您需要时为您提供所有数据,您的工作是使其保持一致,并随心所欲地使用它”

因此,您的 Node 后端必须充当服务器代理,从 Firebase 获取实际数据,并对这些数据进行高级查询,并将查询到的数据返回给客户端。或者,您可以使用无服务器并直接在客户端上执行此操作,但是正如您所提到的,对于那些高度敏感的数据,这可能并不总是安全的。

基本上,您无法避免未查询的数据,但可以将未查询的数据保持在最低限度。这可以通过重组您的数据来实现。

谷歌给你的建议是,

根据您的观点构建您的数据 - Firebase、Google

这意味着,假设有一个显示发票信息的视图。传统上,如果你来自 SQL,你会设计这样的东西

 + invoice
   + i01
     + date: xxx
     + customer: xxx
 + invoice_items 
   + ii01
     + invoice: i01
     + product: p
     + qty: 1
...
Run Code Online (Sandbox Code Playgroud)

谷歌希望你做的是

 + invoice
   + i01
     + date: xxx
     + customer: xxx
     + items: [
        {
          + product: p
          + qty: 1
        }]
...
Run Code Online (Sandbox Code Playgroud)

这样,您就无需“需要”进行高级查询,因为您的视图所需的所有数据都已经存在。

这似乎是一种退步,因为如果您考虑一下,这只会导致数据库状态迟早会进入不一致的状态,而且您是对的,有时确实会这样做。但 Firebase 确实提供了应对措施,例如多路径更新

希望这可以帮助 :)

  • 你很好地解释了权衡背后的原因。非常有帮助的答案。 (2认同)