【问题标题】:Database-style Queries with Firebase使用 Firebase 的数据库式查询
【发布时间】:2012-07-20 05:27:40
【问题描述】:

有没有一种使用 Firebase 执行数据库样式查询的快速方法?

例如:

给定一个带有 user_idnameage 字段的 firebase 引用 users,执行类似于此的查询的最佳方法是:

SELECT name FROM users WHERE `user_id`=147;

SELECT COUNT(*) FROM users WHERE age=21;

【问题讨论】:

    标签: javascript firebase


    【解决方案1】:

    我为 firebase 创建了自己的 CMS,因此在创建 firebase 数据表时,我使用它对其进行了过滤

    var child = ref.child();
    var compare;
    switch(filter){
              case "First_Name":
                compare = child.First_Name;
              break;
              case "Last_Name":
                compare = child.Last_Name;
              break;
              case "Phone_Number":
                compare = child.Phone_Number;
              break;
              case "Department_Number":
                compare = child.Department_Number;
              break;
              case "Position":
                compare = child.Position;
              break;
              case "Status":
                compare = child.Status;
              break;
              case "Tier":
                compare = child.Tier;
              break;
          }
    
    
          if(compare.match("^" + string)){
            //display items 
    

    【讨论】:

    • 这就是 Lehenbauer 所说的“客户端查询”。我建议使用这种等效但更易读的形式:if (child[filter].match(‘^’ + string)) {(替换从第二行开始的所有内容)
    【解决方案2】:

    先生。 Lehenbauer 当然是 Firebase 的大师,所以听他的。 ;) 然而,这个特定的话题是我已经努力研究了几个星期了。

    以下是我的一些想法,以增强“运行单独的服务器”和“客户端查询”响应:

    ElasticSearch(一个 node.js 脚本)

    通过服务器上的 node.js 脚本,您可以在一小时内集成 ElasticSearch 并提供一些可靠的内容搜索。这里有一篇博文和一个库,可以让它变得更简单:https://www.firebase.com/blog/2014-01-02-queries-part-two.html

    可缓存/常见查询

    这些可以由读取表并复制数据的服务器/cron 进程处理。例如,假设我想在注册期间为用户的登录名显示“不可用/可用”,但由于某些复杂的原因,使用不同的唯一 ID 存储用户记录。

    我的 cron/server 可以从 users 表中读取所有记录,然后将它们插入到由电子邮件地址存储的另一个表中,其中包含用户记录 ID 的值(或我可能想知道的任何其他数据)。

    这种重复数据方法是一种手动缓存技术,是 No-SQL 环境中的常见做法;我们正在用存储空间(被认为便宜且可用)来换取速度和简化流程。

    自定义查询(使用队列)

    自定义查询可以通过 XHR (ajax) 直接发送到服务器,这可以完成繁重的工作并返回更好的结果。或者,您可以利用 Firebase 通过队列与服务器后端连接。

    客户端将查询请求以 JSON 格式放入名为 queue 的特殊 Firebase 表中并等待响应。

    服务器监听queue.on('child_added', ...)并使用`queue_record.child('response', ...data here...)返回数据

    这有一些不错的优势。一方面,任何数量的服务器都可以监听并提供响应,使负载平衡变得轻而易举。设置代码非常简单,covered in another thread 在 SO 中。

    希望对您有所帮助!

    【讨论】:

    【解决方案3】:

    一般来说,不会。 Firebase 本质上是一个“实时数据库”,随着数据的变化不断地向您流式传输更新,因此进行通用查询更加困难。目前,提供了几个(诚然有限的)查询原语。请参阅文档中的 Queries/Limits 页面。

    您通常可以通过多种方法解决这些限制:

    • 智能地使用位置名称和优先级。如果您将数据构造为 /users/[userid]/name,则只需检索 /users/147/name 即可完成您的第一个“查询”。如果您知道要按年龄查询,可以使用年龄作为用户节点的优先级,然后执行“usersRef.startAt(21).endAt(21).on('child_added', ...)”获取所有 21 岁的用户。您仍然需要手动计算他们。
    • 进行客户端查询。如果整个数据集很小,您可以检索整个数据集,然后在客户端手动过滤/处理。
    • 运行单独的服务器。它可以连接到 Firebase,同步数据,然后为客户回答“查询”。它仍然可以通过 Firebase 与客户端通信,并且 Firebase 仍然可以作为主要数据存储,但您的单独服务器可以完成工作以快速执行查询。

    我们打算随着时间的推移对此进行改进,因为我们意识到与传统关系数据库系统提供的灵活查询相比,这是一个弱点。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    • 2019-07-28
    • 2020-10-16
    • 2017-04-25
    相关资源
    最近更新 更多