2017-03-08 1 views
3

Ich bin von Parse-Server zu Firebase für mein neues Projekt umgezogen, aber erreichte einen Punkt in dem Projekt, wo ich anfing zu denken, dass es eine schlechte Idee war.Firebase für komplexe Abfrage. Ein Nein gehen?

Im Grunde mache ich eine App, wo Leute Informationen über Konzerte in ihrer Stadt veröffentlichen können.

Meine erste Herausforderung bestand darin, die Ereignisse zu filtern, damit ein Benutzer nur Ereignisse in seiner eigenen Stadt bekommt. Ich tat dies die Daten nach der Städte durch die Struktur:

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

Dann Ich denke, ich brauche einen anderen Filter für die Art von Konzert, z Rock, Pop, etc. Also, obwohl ich ich eine weitere Umstrukturierung tat. Es muss jedoch wahrscheinlich 5-10 weitere Filter geben, und es wird sehr schwierig werden, die Datenbank auf eine gute Weise zu strukturieren.

ich aber über mehrere Abfrage, aber das war nicht erlaubt:

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

Ich dachte über, von dem Server alles holen und dann das Ergebnis in dem Client filtern. Ich sehe jedoch zwei Probleme damit:

  1. Es könnte eine Tonne unnötigerweise Daten heruntergeladen werden.
  2. Einige Konzerte werden nur für bestimmte Benutzer gesperrt (z. B. Benutzer, die mindestens 10 andere Konzerte besucht haben), und es könnte ein Sicherheitsaspekt sein, diese Konzerte nach Hause zu ziehen, damit sie nicht gesehen werden können.

Ich dachte über die Kombination von Filter Abfrageschlüssel zu erstellen, wie diese this, aber mit mehr als 10 Filter, wird es zu komplex geworden.

Gibt es eine Lösung für dieses Problem oder sollte ich den Firebase für diesen Anwendungsfall vergessen?

Vielen Dank im Voraus

+1

"Ist Firebase gut für mich?" ist eine Frage, die zu subjektiven Antworten führen wird. Firebase ist eine großartige Ergänzung für einige Entwickler und eine lausige Passform für andere. –

+0

Verwenden Sie es in Kombination mit elasticsearch. Firebase-Datenbank ist eine gute Echtzeit-db, aber für mehr maßgeschneiderte Daten, um elastisch zu dienen, ist der Weg zu gehen. Der einzige Nachteil ist, dass Sie am Ende einen Server Hosting elastic-Suche verwenden, die die Idee der Serverless-Architektur ein wenig bricht –

Antwort

2

unglaublich komplexe Abfragen können in Firebase gefertigt werden. Die Daten müssen in einer Struktur gespeichert werden, die sich zur Abfrage eignet und vor allem keine Angst vor doppelten Daten hat.

Nehmen wir zum Beispiel an, wir haben eine App, die es einem Benutzer ermöglicht, ein Konzert für ein bestimmtes Jahr und einen bestimmten Monat, eine bestimmte Stadt und in einem bestimmten Genre auszuwählen.

Es gibt 3 Parameter

year_month Stadt Genre

Die Benutzeroberfläche fragt den Benutzer zuerst eine Stadt auswählen

Austin 

dann die UI pro Jahr und Monat zu wählen, fragt

201704 

th en Genre

Rock 

Ihre Firebase Struktur wie diese

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 

sieht Ihre UI den Benutzer bereits für die Abfrage Informationen und damit abgefragt hat, eine Abfrage-String bauen

Austin_201704_Rock 

und Dann fragen Sie den Knoten 'city_date_genre' nach dieser Zeichenkette und Sie haben Ihre Daten.

Was passiert, wenn der Benutzer alle Konzerte in Austin für April 2017

queryStartingAt("Austin_201704").queryEndingAt("Austin_201704") 

Sie könnten leicht erweitern durch Hinzufügen eines weiteren Abfrageknoten und die Änderung der Reihenfolge der Daten

concerts 
    concert_00 
    city: Memphis 
    year_month: 201706 
    genre: Country 
    city_date_genre: Memphis_201606_Country 
    city_genre_date: Memphis_Country_201606 
auf diese wissen wollte

Und je nachdem, in welcher Reihenfolge der Benutzer seine Daten auswählt, können Sie den zugehörigen Knoten abfragen.

Das Hinzufügen zusätzlicher Knoten ist eine winzige Menge an Daten und ermöglicht sehr offene Abfragen für die Daten, die Sie benötigen.

+1

Das Problem mit dieser Lösung ist, dass Sie alle Suche-Composite-Schlüssel im Voraus wissen müssen. Sie müssen vorher an alle Kombinationen gedacht haben. Was ist, wenn es eine Kombination gibt, die Sie zu Beginn vergessen haben, und jetzt haben alle Datenknoten es nicht mehr. Wie können Sie diese Knoten nachträglich hinzufügen? – Houman

+0

@Houman Sie haben Recht - wenn Sie jedoch vergessen haben, Schlüssel zu implementieren, müssen Sie Ihren App-Code ändern und diese Schlüssel zu jedem Knoten in Ihrem Firebase hinzufügen - während Sie dies tun, aktualisieren Sie einfach die zusammengesetzten Schlüssel bei die selbe Zeit. – Jay