2017-03-08 8 views
3

私は新しいプロジェクトのためにparse-serverからfirebaseに移りましたが、プロジェクトの中で私がそれが悪い考えであると思っていた点に達しました。複雑なクエリのFirebase。いいえ?

基本的には、自分の町で行われているコンサートに関する情報を投稿できるアプリを作っています。

私の最初の課題は、イベントをフィルタリングすることでした。そのため、ユーザーは自分の町でイベントを取得するだけでした。私は都市の後の構造によってデータをこれをしなかった:

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

は、それから私は、私は別の再構築をしたのに、私は私が別のコンサートのタイプのフィルタ、例えばロック、ポップ、などが必要に把握します。しかし、おそらく5〜10個のフィルタが必要になり、データベースをうまく構築するのが非常に難しくなります。

Iに関する複数のクエリしかし、これは許されませんでした。

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

私は、サーバーからすべてをフェッチについて考え、その後、クライアントに結果をフィルタリングします。しかし、これには2つの問題があります。

  1. 不必要に多くのデータがダウンロードされている可能性があります。
  2. 一部のコンサートは、特定のユーザー(たとえば、他のコンサートに少なくとも10回以上行ったユーザー)のみにロックされます。また、これらのコンサートは、視聴できないユーザーに持ち帰ってしまう可能性があります。

私はこのthisのように、クエリのキーを作成するためにフィルタを組み合わせることを考えたが、10以上のフィルターと、それは複雑になります。

この解決策はありますか、この使用例ではfirebaseについて忘れてはいけませんか?

ありがとうございます。

+1

"Firebaseは私にとっては良いですか?"主観的な答えにつながる質問です。 Firebaseは、いくつかの開発者には最適で、他の開発者にとってはぴっ​​たりです。 –

+0

elasticsearchと組み合わせて使用​​してください。 Firebaseデータベースは優れたリアルタイムのデータベースですが、弾力的なデータを提供するためのより多くのデータのためには、行く方法です。唯一の欠点は、serverlessアーキテクチャのアイデアを少し破る弾性検索を使用するサーバーを使用することになります。 –

答えて

2

Firebaseで信じられないほど複雑なクエリを作成することができます。データは、照会するのに役立つ構造体に格納する必要があり、最も重要なことは、重複データを恐れないことです。

たとえば、ユーザーが特定の年と月、特定の都市、特定のジャンルのコンサートを選択できるアプリがあるとします。

3つのパラメータ

year_month 市 ジャンル

があるUIが最初の市

Austin 

を選択するようにユーザに問い合わせ、その後UIは年と月

を選択するように求められます
201704 

thジャンルエン

Rock 

あなたFirebase構造は、クエリ文字列を構築し、すでにクエリ情報のためおよびそれとユーザーをポーリングしたあなたのUIこの

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 

のように見えます

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 

ユーザーがデータを選択する順序に応じて、関連ノードを照会することができます。

追加のノードを追加することは、ごくわずかなデータであり、必要なデータに対して非常にオープンなクエリを実行できます。

+1

このソリューションの問題は、すべての検索複合キーを事前に知る必要があることです。あらかじめすべての組み合わせを考えておく必要があります。最初に実装するのを忘れた組み合わせがあり、すべてのデータノードがそれを持っていない場合はどうなりますか?これらのノードをどのように遡及的に追加できますか? – Houman

+0

@Houmanしかし、あなたが正しいキーを実装するのを忘れてしまった場合は、アプリケーションコードを変更してFirebaseのすべてのノードにそれらのキーを追加する必要があります。同じ時間。 – Jay