2017-11-19 1 views
1

올바르게 쿼리하기 위해 데이터베이스를 구조화하는 방법에 대한 조언이 필요합니다. 데이터베이스의 구조가 모든 것으로 이해되었지만 올바르게 사용하고 있는지 확신 할 수 없습니다.Firebase 데이터 카스트 구조 어드바이스

기본적으로 내 앱은 API에서 데이터를 검색하여 목록보기에 표시합니다. listview의 모든 항목 (newspost)은 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입니까?

내가 유일한 사용자이기 때문에 이번 달 경고 제한 (10GB)이 다운로드되는 제한 사항이 있습니다.

도움을 주시면 감사하겠습니다.

사이드 노트 : userAvatar는 데이터베이스의 바이트 []에 저장됩니다. 좋지 않습니까?

+0

원하는 데이터를 얻을 수 있었습니까? –

+0

@AlexMamo 예, 아니요. 쿼리를 사용하면 스냅 숏이 존재하지 않습니다. dbref를 사용하면 주석을 얻지 만 firebase db의 큰 요청에 대해 불평합니다. 1 명의 사용자를 위해 한달 내에 거의 10GB의 다운로드를 사용했기 때문에 뭔가가 분명히 심하게 구조되었습니다 ... – JoSem

답변

0

Firebase를 사용할 때 염두에 두어야 할 몇 가지 규칙이 있습니다. 당신의 특별한 경우에, 나는 당신에게 비정규 화를 사용하고 가능한 한 평평 해 지도록 데이터베이스를 바꾸라고 권합니다. 더 나은 이해를 위해이 비디오 (Denormalization is normal with the Firebase Database)를 참조하십시오. Firebase Realtime Database는 여러 속성을 쿼리 할 수 ​​없으므로 usaaly는 복제 데이터를 포함합니다. 파이어베이스와 관련해서는 이런 일이 정상입니다. 당신의 특별한 경우에, 나는 당신에게 두 가지 일을 모두 재촉합니다.

또한이 게시물을 읽으 셨습니다. Structuring your Firebase Data correctly for a Complex App. 매우 잘 설명되어 있으며 최선의 결정을 내리는 데 도움이됩니다.

데이터베이스에 완벽한 구조가 없음을 알아야합니다. 데이터를 매우 쉽고 효율적으로 읽고 쓸 수있는 방식으로 데이터베이스를 구조화해야합니다. 아직 모를 경우 Firebase는 Cloud Firestore이라는 신제품을 출시했습니다. 실시간 데이터베이스는 새로운 Firestore가 수행하는 동안 자동으로 확장되지 않습니다.

0

현재 "comments"내에 루트 노드로 "NewsPostID"를 추가하고 있습니다. 모든 새로운 주석이 "주석"노드 내에 새로운 루트로 추가되므로이 구조는 더 많은 저장소 크기를 소비합니다.

우리가 다음과 같은 질문을하고 싶다고 가정 해보십시오. 특정 사용자가 모든 단일 날짜에 대한 모든 의견. 그래서이 경우 현재 구조는 쿼리를 적용하기가 복잡합니다. 당신은 "의견"에서 "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" 

:

당신은 같은 구조를 변경할 수 있습니다. 이렇게하면 노드 크기가 줄어들고 쿼리에 도움이됩니다.