2017-06-26 9 views
0

私はfirebaseデータベースを試しています。私は、多対多または多対多関係のモデリングの推奨方法をチェックしていました。火災ベースでの遅延ロード?

私は投稿とユーザーの間にこの関係があります。 ユーザーには多くの投稿があります。

これは、モデルの設計のための私のアプローチです:

class User{ 

List<String> postIds; 

... 
} 

class Post{ 

String userId; 

.... 
} 

これはfirebaseドキュメントhereに応じています。

このデザインがフラットなmongodbスタイルのように、ユーザーが作成した投稿を埋め込むのではなく、デザインが好きです。後で、システム上のユーザーだけを取得したい場合は、ユーザーの下にある投稿をプルする必要はありません。

しかし、このデザインの疑問は、後で問題になる可能性のある投稿内にIDを埋め込むことさえ疑問です。 1000人の投稿を持つ100人のユーザーがいるとします。ユーザーのリストを表示したい場合、100人のユーザーを引き出す必要があります。つまり、10万のポストIDを取得する必要があります。

firebaseに遅延ロードの概念はありますか?つまり、ユーザーエンティティを取得するとき、postIdsは自動的にロードされません。必要に応じてロードする必要があります。

答えて

1

現時点では、Firebaseには「遅延ロード」または「ロードオンデマンド」コンストラクトはありません。場所の下にあるすべてのデータは、アクセス時に読み取られ、転送されます。あなたができることの1つは、UserUserInfoを2つの異なるブランチに分けて、余分なデータを取り込まずにユーザーに個別にアクセスできるようにすることです。

class User { 
    String id; 
    String name; 
    String gender etc. 
} 

class UserInfo { 
    List<String> postIds; 
    Other info maintained per user 
} 

このようにして、余分な情報を取得せずにユーザーを読み取ることができます。

0

Firebaseの重要なルールは、データをできるだけフラットにすることです。より良い理解のために、この投稿、Structuring your Firebase Data correctly for a Complex Appを見ることができます。

Firebaseデータベースに各ノードのプロパティを1つだけダウンロードする方法はないので、これを実現する1つの方法は、すべてのIDをホストする新しいノードを使用することです。ですから、IDの存在を確認したり、すべてのユーザーを数えたりする効率的な方法が必要な場合は、idsのリストだけをダウンロードしてください。適切な尺度のためには、データベース内のIDのリストを正確に保持する必要があります。

DatabaseReference postRef = FirebaseDatabase.getInstance().getReference().child("Post"); 

postRef.addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     for (DataSnapshot ds : dataSnapshot.getChildren()) { 
      String uId = ds.getKey(); 
      Log.d("TAG", uId); 
     } 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 
    throw databaseError.toException(); // don't ignore errors 
    } 
}); 

はそれが役に立てば幸い:

は、すべてのこれらのIDを取得するには、このコードを使用することができます。

関連する問題