2016-07-31 10 views
0

firebaseでのデータ取得に関する説明をしたいと思います。私はNoSqlのデータ構造の専門家ではなく、私の心には何かがありません。私にとって自然なことではありません。しかし、私はこのような構造の双方向関係の基礎を理解していると思います。ここで
Firebaseの双方向関係/データの取得

は私のデータ構造である:

{ 
// Two-way relationships between accounts & logements 
    "accounts" : { 
    "uniqueId1" : { 
     "nom" : 'My name 1', 
     "email" : 'My email 1', 
     "logements" : { 
      uniqueIdLogement1 : true, 
      // do I have to list relationships with images & geofire here ? 
      uniqueIdLogement2 : true 
     }, 
     "favorites" : { 
      uniqueIdLogement2 : true, 
      uniqueIdLogement25 : true, 
      uniqueIdLogement32 : true 
     } 

    }, 
    .... 
    }, 
    // Each logement has his own "images" & "geofire" data 
    "logements" : { 
    "uniqueIdLogement1" : { 
     "nom_du_logement" : 'My logement name 1', 
     "accounts" : { 
      uniqueId1 : true 
     }, 
     "images" : { 
      uniqueIdImages1 : true, 
      uniqueIdImages2 : true, 
      uniqueIdImages3 : true, 
     }, 
     "geofire" : { 
      uniqueIdGeofire1 : true 
     }, 
    }, 
    ... 
    }, 
    "images" : { 
    "uniqueIdImages1" : { 
     "image" : 'My image URL 1', 
     "logements" : { 
      uniqueIdLogement1 : true 
     } 
    }, 
    ... 
    }, 
    "geofire" : { 
    "uniqueIdGeofire1" : { 
     "g" : 'My geofire Data, 
     "l" : { 
      0 : '-44.34', 
      1 : '-3.2' 
     }, 
     "logements" : { 
      uniqueIdLogement1 : true 
     } 
    }, 
    ... 
    } 
} 

私は、誰もがデータ構造についてのビューの彼自身のポイントを持っていると思うが、(Firebaseドキュメントの参照で)私の意見では、それは非常にそのようにする必要があります。しかし、あなたがいくつかの更新を見るならば、躊躇しないでください!

ので、angularJsでは、私はexempleのために、「uniqueId1」でアカウントの各「logements」をリストアップし、& geofireデータを、独自の「画像」を表示する(と彼らは私のユーザーのお気に入りのlogementsあるかどうかを確認)したいと思います。
これは可能ですか?

// list every logements for account ID1 
    // for each logement take images data & geofire data & check if favorites 
     // push infos in $scope.items & display with ng-repeat 

それに対するもう一つの質問:私は、ユーザーID1のための「logements」を削除すると、私はすべての画像にも& geofireの参照を削除したいです...!それも可能ですか?

// remove uniqueIdLogement1 from account ID 1 
    // remove images where "logements" = uniqueIdLogement1 
    // remove goofier where "logements" = uniqueIdLogement1 

は、私は私がそれを正しく理解すれば、それは私のために大丈夫だろうと思います!私はちょうどそれがどのように動作するか分かりません。この種のデータベースでは多くの可能性があることが分かっているので、イライラしています。それについての詳細を教えてください。ありがとうございます

答えて

1

どのデータベースでも、複数の場所のデータを結合してビューを構築する必要があることがよくあります。

リレーショナルデータベースでは、JOIN句を使用して、1つのステートメントでこれらの複数の場所(その場合のテーブル)からデータを取得できます。

Firebase(および他の多くのNoSQLデータベース)では、複数の場所からデータを結合する組み込みの方法はありません。だからあなたのコードでそれをしなければならないでしょう。

var ref = firebase.database().ref(); 
var accountRef = ref.child('accounts/uniqueId1'); 
accountRef.on('value', function(accountSnapshot) { 
    var logementCount = accountSnapshot.child('logements').numChildren; 
    var logementLoadedCount = 0; 
    accountSnapshot.child('logements').forEach(function(logementKey) { 
    var logementRef = ref.child('logements').child(logementKey.key); 
    logementRef.once('value', function(logementSnapshot) { 
     var logement = logementSnapshot.val(); 
     logementLoadedCount = logementLoadedCount + 1; 
     if (logementLoadedCount == logementCount) { 
     console.log('We've loaded all logements'); 
     } 
    }); 
    }); 
}); 

SQLと従来のWeb開発のバックグラウンドの開発者の多くは、これらのネストされた呼び出しのパフォーマンスを心配しています。必要なFirebaseでは、Firebaseは要求を1回の接続でパイプライン処理するので、(妥当な量のデータに対して)必要ありません。 Speed up fetching posts for my social network app by using query instead of observing a single event repeatedlyを参照してください。

一般的には、この記事をNoSQL data modelingで読むことを強くお勧めします。

関連する問題