2016-10-22 1 views
0

DATABASE 계층 :사용자가 만든 모든 게시물을 올바르게 쿼리하는 방법은 무엇입니까?

posts 
    post1_uid 
     author: user2UID 
     info1 
     info2 
    post2_uid 
     author: user1UID 
     info1 
     info2 
users 
    user1_UID 
     info1 
     info2 
     info3 
    user2_UID 
     info1 
     info2 
     info3 

상황 :

사용자는 게시물을 작성할 수 있습니다. 각 게시물에는 게시물을 만든 사용자의 UID를 보유하는 "저자"속성이 있습니다. 내가 한 사용자의 모든 게시물을 표시 할 경우

, 내 중포 기지 GET 요청 쓰기 :


CODE :

if (childData.author == firebase().auth().currentUser.uid) { 
    //Show those posts created by the current user 
} 

질문

효과가 있습니까? 내 Firebase 데이터베이스에 수백만 개의 게시물이 있고 현재 사용자의 ID를 각 게시물의 "작성자"속성과 비교해야합니까?

아니요, 더 좋은 옵션이 있습니까? 내 "사용자/UID /"경로에서 사용자가 만든 모든 게시물의 UID가 포함 된 "게시물"노드를 만들기

: 나는을 뭘하려


.

마찬가지로, 데이터베이스 (수백만)의 모든 게시물을 반복하는 것에 비해 훨씬 작은 json 트리 (사용자가 만든 모든 게시물 (100) 만 반복)를 통해 반복합니다. 사용자. 하지만 이것은 실제로 성능에 영향을 줍니까? 그만한 가치가있는 데이터 중첩이 있습니까?


다른 데이터베이스 계층 구조 : 여기

posts 
    post1_uid 
     author: user1UID 
     info1 
     info2 
    post2_uid 
     author: user1UID 
     info1 
     info2 
users 
    user1_UID 
     info1 
     info2 
     info3 
     posts 
     referenceUID 
      post1UID 
      post2UID  
    user2_UID 
     info1 
     info2 
     info3 

내 예제의 동작을 모방하는 가짜 데이터와 실제 데이터베이스 계층 구조입니다.

enter image description here


TL; DR :

어떻게 적절하게 사용자에 의해 생성 된 모든 게시물을 찾고 쿼리를 최적화 할 수있는 중포 기지 데이터베이스를 구성 할 수?

답변

2

대답은 defenitly 각 사용자의 게시물 데이터를 중첩 할 것입니다.

전체 게시물 노드에서 필터링 할 때의 주요 성능 문제는 다음과 같습니다. 우선, 현재 사용자의 글을 필터링하기 위해 postsRef.orderByChild('author').equalTo(currentUser.uid)을 알게되면 orderByChild과 같은 쿼리를 실행해야합니다. author에서 색인을 사용하더라도 비싼 작업으로 백만 건의 레코드 비용이 많이 든다.

두 번째 접근법의 단점은 게시물 항목을 복제한다는 것입니다.하지만 nosql 데이터베이스에서는 괜찮습니다. 변경 사항이 발생할 때마다 모든 복제본을 업데이트 할 때 조심해야합니다.

관련 문제