【问题标题】:handling complex queries in firebase处理 firebase 中的复杂查询
【发布时间】:2015-04-19 03:44:04
【问题描述】:

我正在开发一个使用 ionic 框架和 FIREBASE 作为后端的购物车移动应用程序。我有一个要求,我需要通过多个数据属性加入 JOIN、SORT、FILTER 和 PAGINATE。

示例数据结构如下。

产品:{

prod1:{
    name: Samsung-s4,
    type: pro,
    category: Phone,
    created_datetime: 1426472828282,
    user: user1,
    price: 400

},

prod2:{
    name: iPhone 5s,
    type: pro,
    category: Phone,
    created_datetime: 1426472635846,
    user: user2,
    price: 500

},

prod3:{
    name: HP Laptop i3,
    type: regular,
    category: Computer,
    created_datetime: 1426472111111,
    user: user1,
    price: 600

}

}

用户配置文件:{

user1:{
    name: abc_user,
    display_name: ABC,
    email: abc@mail.com
},

    user2:{
    name: xyz_user,
    display_name: XYZ,
    email: xyz@mail.com
}

}

我需要使用多种方式查询产品。下面给出两个简单的例子。

1) 使用 Pagination 获取所有产品,其中 type 为“pro”,然后加入 user_profiles 并按创建日期排序。

2) 使用 Pagination 获取所有产品,按类别过滤,然后加入 user_profiles 并按创建日期排序。

和上面一样,会有越来越多的过滤选项出现,例如:价格。

我的主要问题是,我找不到使用 FIREBASE 查询选项的直接方法。我还参考了 firebase util 文档,但我也没有看到完成这项工作的方法。

据我所知,完成此任务的唯一方法是,通过将所有数据(或大部分数据)输入客户端并在客户端执行 SORT / FILTER / PAGINATE 在客户端进行大部分处理结束。

但我们预计这些模式中有数千条记录,因此如果我们在客户端进行处理,将会对性能产生巨大影响!!

感谢您解决此问题的专业知识/支持。

提前谢谢你。

更新:

我更改了数据结构(如 webduvet 解释的那样)并尝试使用 firebase-util 但未能实现我想要的。标准:产品 -> 按类型/专业过滤 -> 按 products.created_date 排序

类型:{

专业人士:{

product1: user1,
product3: user1,

...

}, 常规的:{ ... }

}

firebase-util - angularfire 代码

            var list =  $firebase(new Firebase.util.NormalizedCollection(
                    ref.child("products").orderByChild('created_datetime'),         
                    ref.child('type').child('pro')
                ).select(
                        {key: "products.name" , alias: 'name'}
                ).ref()).$asArray();

“products”将有十万条记录,因此我们必须确保我们尽可能在 firebase 端进行限制,而不是在客户端处理。

请帮忙!

【问题讨论】:

    标签: firebase angularfire


    【解决方案1】:

    这必须通过数据库设计而不是查询来完成。您需要以非规范化的方式存储数据,例如:

    type: {
      pro:{
        product1: user1,
        product3: user1,
      ...
      },
      regular:{
       ...
      }
    }
    

    上述结构将为您提供查询所有专业产品和检索用户 ID 的选项。 Firebase 提供了良好的排序机制,所以应该没有问题。您需要的查询越复杂,需要的数据结构就越复杂,您将拥有的非规范化数据就越多。

    但正如@Swordfish0321 指出的那样,sql 类型的 db 毕竟可能更适合您。

    【讨论】:

    • 谢谢!是的,我理解你指出的概念。我也尝试过同样的方法,但问题是我们需要将 type/pro 与产品结合起来以获取产品详细信息。然后我们需要按产品中的属性 created_date 进行排序。 Firebase 不支持先加入再排序。唯一的选择是在加入两个数据集后使用原生 JavaScript 排序。
    • Pramod,您可以使用NormalizedCollection 来加入数据,您可以对传入 NormalizedCollection 的第一个 ref 进行排序以实现排序。 @webduvet 在这里仍然是正确的,以稍后要读取的格式写入数据是正确的答案,而不是试图将 SQL 关系强加到 NoSQL 数据结构上。努力写入以使读取更容易。
    • @Kato 嗨 Kato,我尝试使用带有数据结构 webduvet 解释的 firebase 实用程序。但我仍然无法得到想要的结果。主要问题是,要按 created_datetime 对产品进行排序,我们必须将“产品”作为第一个参考传递,但它会成为主索引.. 不是吗?然后我将获取产品参考中的所有记录,我将无法获取按类型/专业过滤的记录。根据文档,我必须在 firebase util 中使用 FILTER 选项。我主要关心性能。如果产品会有数千条记录??我更新了 firebaseutil 代码
    • 您不会一次在客户端上显示数千条记录;这在任何 ui 中都不实用或有用。使用产品作为第一个参考创建 NormalizedCollection 是您想要的。在将 ref 传递到 NormalizedCollection 之前按类型/专业过滤。此外,这不是讨论论坛或调试组。如果提供的答案无法回答您的问题,则需要对问题进行相应的简化和细化。或提出后续问题。
    • @Kato 我不会显示数千条记录!我的观点是,如果我们不能在 Firebase 中直接过滤“产品”,我们将最终在客户端处理记录(过滤/排序),当没有大量记录时,这将影响性能。根据您的要求,我将发布一个更新数据结构和代码的后续问题。希望你能出席!谢谢
    猜你喜欢
    • 1970-01-01
    • 2019-10-16
    • 2018-08-19
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多