我正在使用离子框架和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
}
}
user_profiles:{
user1:{
name: abc_user,
display_name: ABC,
email: abc@mail.com
},
user2:{
name: xyz_user,
display_name: XYZ,
email: xyz@mail.com
}
}
我需要使用多种方式查询产品。下面给出两个简单的例子。
1)获取所有带分页的产品,其中type为“pro”,然后按创建日期加入user_profiles和SORT。
2)获取所有具有分页的产品,按类别过滤,然后按创建日期加入user_profiles和SORT。
如上所述,将会有越来越多的过滤选项,例如:价格。
我的主要问题是,我找不到使用FIREBASE查询选项直接执行此操作的方法。我也提到了firebase util文档,但我也没有看到完成这项工作的方法。
据我所知,只有通过将所有数据(或大部分数据)输入客户端并在客户端进行SORT / FILTER / PAGINATE,才能在客户端进行大部分处理。端。
但我们期待这些架构中有数千条记录,因此如果我们在客户端进行处理,会对性能产生巨大影响!!
感谢您的专业知识/支持来解决这个问题。
提前谢谢你。
更新
我更改了数据结构(如webduvet所解释的)并尝试使用firebase-util但未能实现我想要的效果。标准:产品 - >按类型/专业版过滤 - >按产品排序.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();
“产品”将有十万条记录,因此我们必须确保尽可能多地限制firebase结束而不是在客户端处理。
请帮忙!
答案 0 :(得分:3)
这不是通过查询而是通过数据库设计完成的。您需要以非规范化方式存储数据,例如:
type: {
pro:{
product1: user1,
product3: user1,
...
},
regular:{
...
}
}
上述结构将为您提供查询所有专业产品和检索用户ID的选项。 Firebase提供了良好的排序机制,因此不会出现问题。您需要的查询越复杂,需要的数据结构就越复杂,您将拥有更多的非规范化数据。
但正如@Swordfish0321指出的那样,sql类型的db可能会更适合你。