我已经从解析服务器转移到firebase用于我的新项目,但是在项目中我已经开始认为这是一个坏主意.
基本上,我正在制作一个应用程序,人们可以发布有关他们镇上的音乐会的信息.
我的第一个挑战是过滤事件,因此用户只能在他/她自己的城镇中获取事件.我通过构建城市之后的数据来做到这一点:
{ concerts: { "New york": { ...,... },"Chicago": { ...,... } } }
然后我想我需要另一种音乐会类型的过滤器,例如摇滚,流行音乐等.所以我虽然做了另一次重组.但是,可能需要再增加5到10个过滤器,并且很难以良好的方式构建数据库.
我虽然有多个查询,但这是不允许的:
firebase.database().ref("concerts") .orderByChild("type").equalTo("rock") .orderByChild("length").equalTo("2") .orderByChild("artist").equalTo("beatles")
我想过从服务器获取所有内容,然后在客户端中过滤结果.然而,我看到两个问题:
>可能会下载大量不必要的数据.
>某些音乐会只会锁定某些用户(例如已经参加过至少10场其他音乐会的用户),并且可能存在将这些音乐会拉回到用户不被允许看到它们的安全方面.
我想过组合过滤器来创建查询键,比如这个this,但是有了10多个过滤器,它将变得复杂.
有没有解决方案,或者我应该忘记这个用例的firebase?
提前致谢
可以在Firebase中制作难以置信的复杂查询.数据需要存储在一个有待查询的结构中,最重要的是,不要害怕重复数据.
例如,假设我们有一个应用程序,使用户能够选择特定年份和月份,特定城市和特定类型的音乐会.
有3个参数
YEAR_MONTH
市
类型
Austin
然后UI要求选择年份和月份
201704
然后是一种类型
Rock
您的Firebase结构如下所示
concerts concert_00 city: Memphis year_month: 201706 genre: Country city_date_genre: Memphis_201606_Country concert_01 city: Austin year_month: 201704 genre: Rock city_date_genre: Austin_201704_Rock concert_02 city: Seattle year_month: 201705 genre: Disco city_date_genre: Seattle_201705_Disco
您的UI已经在用户中查询了查询信息,并使用该信息构建查询字符串
Austin_201704_Rock
然后在’city_date_genre’节点查询该字符串,并获得数据.
如果用户想知道2017年4月奥斯汀的所有音乐会,该怎么办?
queryStartingAt("Austin_201704").queryEndingAt("Austin_201704")
您可以通过添加另一个查询节点并更改数据的顺序来轻松扩展此功能
concerts concert_00 city: Memphis year_month: 201706 genre: Country city_date_genre: Memphis_201606_Country city_genre_date: Memphis_Country_201606