2017-02-23 91 views
1

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

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

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

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

工作完全正常!

但现在我想创建高级查询和这里就是我奋斗:

  • 火力地堡的内置查询的还不够强大
  • 客户端是太糟糕表现的原因。
  • 相同的服务器端。我需要将所有未找到的数据传送到我的服务器。

那么有没有什么好的方法来避免传输unqueried数据?也许因为我使用gcloud反正管理sdk?

我真的很想念自定义终结点。

THX提前!

+0

方式模糊的问题。您对'高级查询'和我的定义可能会非常不同。请提供具体示例,展示一些代码和Firebase结构。另外,请查看[如何提问](http://stackoverflow.com/help/how-to-ask)。更新您的问题,我们会尽力帮助! – Jay

回答

3

Google对'为什么不能进行高级查询?'的回答?只是“重组你的数据,所以你不需要做高级查询”

这看起来像是一个便宜的作品,但这个想法是因为firebase被认为是实时的,它需要查询数据为尽可能快,并且可能没有足够的“时间”/“资源”来为高级查询服务。这从谷歌的观点来看是有道理的,因为他们不能仅仅为你服务更多的服务器资源。在谷歌的心目中,它的简单描述是:“我们为您提供所有数据,当您需要时,您的工作就是让它保持一致,并随您做任何事情”

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

基本上,你不能避免unqueried数据,但可以保持最小的unqueried数据。这可以通过重构您的数据来实现。

建议谷歌给你的是,

结构数据,根据您的意见 - 火力地堡,谷歌

这意味着是,说,如果有一个观点,即显示有关信息发票。传统上,如果你从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

希望这有助于:)

+0

THX。非常好的答案,让我重新思考我的数据库结构!我想我会写所有查询服务器端。并在第一次通话后保存在不同的节点中。 (类似于缓存) – Orlandster

+1

你解释了权衡背后的原因。非常有用的答案。 –