Firebase高级查询

时间:2017-02-23 08:52:10

标签: firebase firebase-realtime-database

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

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

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

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

完美无缺!

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

  • Firebase的内置查询功能不够强大
  • 出于性能原因,客户端太糟糕了。
  • 服务器端相同。我需要将所有未经检验的数据传输到我的服务器。

那么有什么好方法可以避免转移未经检索的数据吗?也许是因为我正在使用gcloud来管理sdk?

我真的很想念自定义端点。

提前THX!

1 个答案:

答案 0 :(得分:3)

谷歌回答“为什么不能进行高级查询?'只是"重组您的数据,因此您不需要进行高级查询"

这可能看起来像是一个廉价的裁剪,但这个想法是因为firebase应该是实时的,它需要尽快查询数据,并且可能没有足够的时间' / '资源'做高级查询。从谷歌的角度来看,这是有道理的,因为他们不能仅仅为您提供更多的服务器资源。谷歌的想法很简单,"我们会在您需要时为您提供所有数据,您的工作就是保持一致,并随心所欲地做任何事情"

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

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

谷歌给你的建议是,

  

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

这意味着,比如说有一个显示发票信息的视图。传统上,如果您来自SQL,那么您可以设计类似这样的内容

 + invoice
   + i01
     + date: xxx
     + customer: xxx
 + invoice_items 
   + ii01
     + invoice: i01
     + product: p
     + qty: 1
...

谷歌希望你做的是

 + invoice
   + i01
     + date: xxx
     + customer: xxx
     + items: [
        {
          + product: p
          + qty: 1
        }]
...
这样,你就不需要'进行高级查询,因为您的视图所需的所有数据都已存在。

这可能看起来像退后一步,因为如果你想一想,这只会导致数据库状态迟早进入一个不一致的状态,并且你会纠正,它确实会这样做。但Firebase确实提供了相应的措施,例如multipath updates

希望这会有所帮助:)