Firebase用于复杂查询。不行吗

Bla*_*use 6 nosql firebase firebase-realtime-database

对于我的新项目,我已经从解析服务器转移到了Firebase,但是在项目中我开始认为这是个坏主意。

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

我的第一个挑战是过滤事件,因此用户只能在自己的城镇中获得事件。我通过构建城市之后的数据来完成此任务:

{
    concerts: {
        "New york": {
            ...,
            ...
        }, 
        "Chicago": {
            ...,
            ...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我认为我需要针对音乐会类型的另一个过滤器,例如摇滚,流行音乐等。因此,尽管我进行了另一次重组。但是,可能需要再增加5到10个过滤器,而以良好的方式构造数据库将变得非常困难。

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

firebase.database().ref("concerts")
.orderByChild("type").equalTo("rock")
.orderByChild("length").equalTo("2")
.orderByChild("artist").equalTo("beatles")
Run Code Online (Sandbox Code Playgroud)

我考虑过从服务器获取所有内容,然后在客户端中过滤结果。但是,我看到了两个问题:

  1. 可能会下载大量不必要的数据。
  2. 某些音乐会将仅被锁定给某些用户(例如,至少参加过其他10场音乐会的用户),并且可能存在安全方面的问题,将这些音乐会带回家以防止用户看到他们。

我曾考虑过将过滤器组合在一起以创建查询键,就像这样,但是如果有10多个过滤器,它将变得很复杂。

有解决方案吗?还是我应该忘记此用例的Firebase?

提前致谢

Jay*_*Jay 7

可以在Firebase中制作极其复杂的查询。数据需要存储在一个易于查询的结构中,最重要的是,不要害怕重复数据。

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

有3个参数

year_month城市类型

用户界面首先查询用户以选择城市

Austin
Run Code Online (Sandbox Code Playgroud)

然后用户界面要求选择年份和月份

201704
Run Code Online (Sandbox Code Playgroud)

然后一种流派

Rock
Run Code Online (Sandbox Code Playgroud)

您的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
Run Code Online (Sandbox Code Playgroud)

您的用户界面已经向用户轮询了查询信息,并以此构建查询字符串

Austin_201704_Rock
Run Code Online (Sandbox Code Playgroud)

然后在“ city_date_genre”节点中查询该字符串,您便拥有了数据。

如果用户想了解奥斯汀2017年4月的所有音乐会怎么办

queryStartingAt("Austin_201704").queryEndingAt("Austin_201704")
Run Code Online (Sandbox Code Playgroud)

您可以通过添加另一个查询节点并更改数据顺序来轻松扩展此功能

concerts
  concert_00
   city: Memphis
   year_month: 201706
   genre: Country
   city_date_genre: Memphis_201606_Country
   city_genre_date: Memphis_Country_201606
Run Code Online (Sandbox Code Playgroud)

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

添加其他节点只需要少量数据,并且可以对所需数据进行开放式查询。

  • 此解决方案的问题在于您需要预先知道所有搜索复合键。您需要事先考虑所有组合。如果有一个你一开始忘记实现的组合,现在所有的数据节点都没有它怎么办。您如何追溯添加这些节点? (2认同)