2017-03-08 21 views
3

我已经从我的新项目从parse-server转移到firebase,但是在项目中我开始认为这是一个糟糕的主意。用于复杂查询的Firebase。一个不走?

基本上,我正在制作一个应用程序,人们可以在其中发布关于他们城镇正在进行的音乐会的信息。

我的第一个挑战是过滤事件,所以用户只能在他/她自己的城镇获得事件。我这样做是通过结构城市后的数据:

{ 
    concerts: { 
     "New york": { 
      ..., 
      ... 
     }, 
     "Chicago": { 
      ..., 
      ... 
     } 
    } 
} 

然后我想我需要另一个过滤音乐会的类型,e.g摇滚,流行,等等。所以我虽然我做了另一个重组。但是,可能需要更多5-10个过滤器,并且以很好的方式构建数据库将变得非常困难。

我虽然对多个查询,但这是不允许的:

firebase.database().ref("concerts") 
.orderByChild("type").equalTo("rock") 
.orderByChild("length").equalTo("2") 
.orderByChild("artist").equalTo("beatles") 

我想到了从服务器获取一切,然后筛选结果在客户端。然而,我看到两个问题:

  1. 可能会有大量不必要的数据被下载。
  2. 一些音乐会只会锁定某些用户(例如至少参加过10次其他音乐会的用户),并且可能存在将这些音乐会拉回到用户不能看到的音乐会的安全方面。

我想过合并过滤器来创建查询键,这样this,但有超过10的过滤器,它会变得复杂。

有没有解决方案,或者我应该忘记这个用例的firebase?

在此先感谢

+1

“是一个会导致主观答案的问题。 Firebase非常适合一些开发人员,并且适合其他人使用。 –

+0

与elasticsearch结合使用。 Firebase数据库是一个很好的实时数据库,但是要提供更多量身定制的数据以提供弹性,这是一条可行的途径。唯一的缺点是你最终会使用一个托管弹性搜索的服务器,这有点违反了无服务器体系结构的想法 –

回答

2

令人难以置信的复杂查询可以在Firebase中制作。数据需要存储在一个适合被查询的结构中,最重要的是,不要害怕重复的数据。

例如,假设我们有一个应用程序,使用户可以选择特定年份和月份,特定城市以及特定类型的音乐会。

有3个参数

YEAR_MONTH 城市 流派

的UI首先查询用户选择一个城市

Austin 

那么UI要求选择一个年份和月份

201704 

th恩流派

Rock 

你的火力地堡结构看起来像这样

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 

根据用户选择数据的顺序,您可以查询关联的节点。

添加额外的节点是少量数据,并允许非常开放式查询您需要的数据。 “是Firebase对我有好处吗?”

+1

这个解决方案的问题是你需要知道所有的搜索组合键。你需要事先想好所有的组合。如果有一个组合,你忘了实施,现在所有的数据节点都没有。你如何回顾性地添加这些节点? – Houman

+0

@Houman您是对的 - 但是,如果您忘记实施密钥开始,那么您将不得不更改您的应用代码,并将这些密钥添加到Firebase中的每个节点 - 而您正在更新组合密钥同一时间。 – Jay