2016-09-06 5 views
3

firebaseデータベースのデータ構造のベストプラクティスについて簡単に質問します。Firebaseデータのフラット化

私のアプリのユーザーが友だちリストを維持できるようにします。 firebaseのドキュメントでは、できるだけ平坦なスキーマを作成することを推奨しています。このため、私はそうのようなデータベースにプレイヤーセクションからの友人のセクションを分離することをお勧めだろうと思った次のよう

{ 


    "players":{ 
    "player1id":{ 
     "username":"john",... 
    }, 
    "player2id": ..., 
    "player3id": ... 
    } 


    "friends": { 
    "player1id"{ 
     "friends":{ 
      "friend1Id":true, 
      "friend2Id":true 
     } 
     }, 
    } 
"player2id"{ 
     "friends":{ 
      "friend1Id":true, 
      "friend2Id":true 
     } 
     }, 
    } 
} 

だから私の質問は以下のとおりです。

はこれがために良いデザインです私のスキーマ?

1人のプレイヤーの友だちリストを取得するとき、すべてのプレーヤーの友だちリストを取得しますか?もしそうなら、これは避けることができますか?

また、アプリがすべてのIDを取得すると、友だちに関する追加情報を取得するにはどうすればよいでしょうか。例えばユーザー名のすべてが取得され、プレーヤーのプロファイルに文字列として格納されます。

答えて

3

これは私のスキーマに適したデザインですか?

あなたはすでに適切な方向に考えています。しかし、「友人」のノードがに単純化することができる:(。)

"friends": { 
    "player1id": { 
    "friend1Id":true, 
    "friend2Id":true 
    } 
} 

Firebaseノード名が文字ドットを使用することはできませんことを覚えておいてください。 IDが1、2、3などの整数であればすべてOKですが、IDがユーザー名である場合は注意してください(たとえば「super123」はOKですが「super.duper」はそうではありません)。

1人のプレイヤーの友だちリストを引っ張ると、すべてのプレーヤーの友人リストが引かれますか?もしそうなら、これは避けることができますか?あなたが/友人/ 1を引いた場合、それは明らかに、その後の友人についての追加情報をプルするための最良の方法であるもの、また

など2//友人を引っ張らないであろう

号一度、アプリケーションはすべてのIDを持っています。例えばユーザー名のすべてが取得され、プレーヤーのプロファイルに文字列として格納されます。

IDをループし、再びFirebaseからそれぞれのノードをフェッチします。たとえば、ユーザー1に友人2,3,4がいる場合、forループを使用すると、fetch/players/2、/ players/3、/ players/4を使用します。

firebase pullは非同期で動作するため、カウンタまたはその他のメカニズムを使用して、最後のデータを取得したときに完了コードを実行し続けることができます。

+0

これはまさに私が感謝の必要なヘルプでした!友人のユーザーIDを取得したら、友人のユーザー名を照会する最善の方法を教えてもらえますか? – Dportology

関連する問題