【问题标题】:Firebase advanced queriesFirebase 高级查询
【发布时间】:2019-11-06 11:32:44
【问题描述】:

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

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

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

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

工作得很好!

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

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

那么有什么好的方法可以避免传输未查询的数据吗?也许因为我一直在使用 gcloud 来管理 sdk?

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

提前谢谢!

【问题讨论】:

  • 模糊问题的方法。您对“高级查询”的定义和我的可能有很大不同。请提供一个具体示例,展示一些代码和您的 Firebase 结构。另外,请查看How to Ask。更新您的问题,我们会尽力提供帮助!

标签: firebase firebase-realtime-database


【解决方案1】:

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

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

因此,您的 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

希望这会有所帮助:)

【讨论】:

  • THX。很好的答案,让我重新思考我的数据库结构!我想我会在服务器端编写所有查询。并在第一次调用后将它们保存在不同的节点中。 (类似于缓存)
  • 您很好地解释了权衡背后的原因。很有帮助的答案。
猜你喜欢
  • 2017-12-21
  • 1970-01-01
  • 2020-03-15
  • 2016-02-01
  • 2014-02-22
  • 2012-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多