2016-07-13 17 views
5

私のデータは非正規化されており、firebaseチームが提案したような逆索引を使用しています。次のようなもの:Firebaseデータベース - 複数のエントリを取得する

{ 
    "users": { 
    "alovelace": { 
     "name": "Ada Lovelace", 
     // Index Ada's groups in her profile 
     "groups": { 
     // the value here doesn't matter, just that the key exists 
     "techpioneers": true, 
     "womentechmakers": true 
     } 
    }, 
    ... 
    }, 
    "groups": { 
    "techpioneers": { 
     "name": "Historical Tech Pioneers", 
     "members": { 
     "alovelace": true, 
     "ghopper": true, 
     "eclarke": true 
     } 
    }, 
    ... 
    } 
} 

今、私はすべてのAdaのグループをロードします。自分のユーザーオブジェクトの一部であるため、自分が所属するグループIDのリストを簡単に取得できます。

Adaのすべての特定のグループを一度にIDで照会する方法はありますか?または、グループIDごとにValueEventListenerを作成し、それぞれのグループを個別にリクエストする必要がありますか?

セキュリティ面では、すべてのグループがそのメンバーだけが読み取り可能であると仮定して、すべてのグループを照会して事実の後でソートすることはできません。

+0

ほとんどのアプリケーションを、個別に各グループをロードします。 Firebaseはデータベースリクエストをパイプライン化するので、これは大きなパフォーマンス低下ではありません。 http://stackoverflow.com/questions/35931526/speed-up-fetching-posts-for-my-social-network-app-by-using-query-instead-of-obse/35932786#35932786 –

+0

@FrankvanPuffelen Doあなたがリストをループし、それぞれのための 'ValueEventListener'をセットすると、DBはそれ自身でデータを取得する方法を最適化するでしょうか?または、ある方法でデータを要求する必要がありますか? –

+0

すべての要求は同じ接続を経由します。 'get(1)'、 'get(2)'、 'get(3)'、 'getAll([1,2,3]) 'の唯一の違いはフレームのオーバーヘッドです。 –

答えて

1

は、私はあなたのような何かを行うことができると思います:

var ref = new Firebase("<..>/groups"); 
ref.orderByChild("members/alovelace").equalTo(true) 
    .once('value').then(function(dataSnapshot) { 
    // handle read data 
}) 

(未テストが、thisディープ・クエリに応じてサポートされるようになりました)インデックスからキーによる

+0

はAndroidでこれを使用します:Query query = mFirebaseDatabaseReference.child( "groups")。orderByChild( "members /" + user.getId ())。equalTo(true); 。これはすべてのデータの1つのクエリです! – itzhar

+0

このアプローチには2つの欠点があります。第1に、セキュリティの観点から言えば、すべてのユーザーが 'groups'ツリー全体を読むことができ、2番目に、グループが非常に多い場合、おそらく少し遅く無駄でしょう。私が興味を持っているグループの正確なIDを既に知っています - それを使わないのは残念です。 –

関連する問題