2017-11-19 17 views
1

正しく照会するためにデータベースをどのように構造化するかに関するアドバイスが必要です。私はデータベースの構造がすべてであると理解していますが、正しく使用しているかどうかはわかりません。Firebaseのデータバス構造のアドバイス

私のアプリは、基本的にAPIからデータを取得し、それをリストビューに表示することになっています。リストビュー内のすべてのアイテム(新聞記事)は、firebaseユーザーからのコメントを持つことができます。

私はこのような "NewsPost"、 "User"、 "Comment"モデルを持っています。

NewsPost.class 

private String id; 
private String date; 
private String title; 
private String commentsNumber; 
private List<Comment> comments; 
private String imageUrl; 

User.class 
private String userName; 
private String userAvatar; 
private String firstName; 
private String lastName; 
private String eMail; 

Comment.class 
private UUID uuid; 
private String postId; 
private String message; 
private String postDate; 
private String userAvatar; 
private String userName; 

だからこれは私がそれを保存しようとした方法である:

Firebase data structure

、これは私は、ユーザが特定のnewsPostItemのコメントを読むためにクリックしたときにコメントを取得しようとする方法ですnewsPostIdをクエリパラメータとして持つlistView。

public void getComments(String postId) { 

comments = new ArrayList<>(); 
Query query = databaseReference.child("comments").orderByChild(postId).equalTo(postId); 
     query.addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       if (dataSnapshot.exists()) { 
        for (DataSnapshot issue : dataSnapshot.getChildren()) { 
         Comment comment = issue.getValue(Comment.class); 
         comments.add(comment); 
        } 
        Log.d("GETCOMMENTS", "SNAPSHOT EXISTS"); 
        view.onCommentsLoaded(comments); 
       } 

       else{ 
        view.onCommentsLoaded(comments); 
        Log.d("GETCOMMENTS", "SNAPSHOT NOT EXISTS"); 
       } 

      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 
       view.onCommentsLoaded(comments); 
       Log.d("GETCOMMENTS", databaseError.getMessage()); 
      } 
     }); 
} 

私の質問は、amidoinitriteですか?

私は唯一のユーザであるため、今月警告(10 GB)の制限をダウンロードしました。

ご協力いただきましてありがとうございます。

サイドノート:userAvatarはデータベースのバイト[]に格納されていますが、いいですか?

+0

希望のデータを取得できましたか? –

+0

@AlexMamoはい、いいえ。クエリを使用すると、スナップショットは存在しません。 dbrefを使用するとコメントが表示されますが、firebase dbからの大きなサイズのリクエストについては不平を言います。私は1人のユーザーのために1ヶ月以内にほぼ10 GBのダウンロードを使用しているので、何かが明らかにひどい構造です... – JoSem

答えて

0

Firebaseを使用している場合、注意する必要があるいくつかのルールがあります。あなたの特定のケースでは、私はあなたに非正規化を使用し、データベースをできるだけ平坦に変更するよう勧めます。理解を深めるために、このビデオ、Denormalization is normal with the Firebase Databaseをご覧ください。 Firebase Realtime Databaseは複数のプロパティを問い合せることができないため、ussalyは複製データを含みます。 Firebaseについて言えば、これは正常です。あなたの特別なケースでは、私はあなたに両方のことを勧めています。

また、あなたはこの投稿を読んでください、Structuring your Firebase Data correctly for a Complex App。これは非常によく説明されており、最良の決定を下すのに役立ちます。

データベースには完全な構造がないことを知る必要があります。あなたは非常に簡単に、そして非常に効率的にデータを読み書きすることができるようにデータベースを構造化する必要があります。まだわからない場合、FirebaseはCloud Firestoreという新製品をリリースしました。 Realtime Databaseは、新しいFirestoreが実行している間は自動的に拡大/縮小されません。

0

現在、 "コメント"内にルートノードとして "NewsPostID"を追加しています。 新しいコメントがすべて「コメント」ノード内に新しいルートとして追加されるため、この構造はより多くのストレージサイズを消費します。

特定のユーザーが1つの日付に対してすべてのコメントを照会するとします。この場合、現在の構造はクエリを適用するのが複雑です。あなたは、「コメント」から「USEREMAIL」を使用してユーザテーブルからすべてのユーザーに関連する詳細情報を取得することができます

"comments" 
    -"userEmail" 
      - "NewPostDate" 
         - "NewpostID:15478" 
             -KHZzTwazaSd (this is random id) 
              -"message: hey.." 
              -"postDate: Date + 12:10PM" 
             -KHZzTwazaSd (this is random id) 
              -"message: Nice post.." 
              -"postDate: Date + 12:22PM" 
         - "NewpostID:54478" 
             -KHZzTwazaSd (this is random id) 
              -"message: Nice day" 
              -"postDate: Date + 10:45PM" 

あなたのような構造を変更することができます。これはノードのサイズを減らし、クエリにも役立ちます。