2015-01-12 2 views
4

필자는 Firebase에 두 가지 항목을 가지고 있습니다 : providersservices으로, Firebase의 권장 평면화 된 아키텍처 접근법을 사용하여 관계를 구축하고 구축하는 최선의 방법을 찾아 내려고하고 있습니다.Firebase에서 관계 구축하기

내 데이터는 다음과 같은 :

{ 
    "services" : { 
    "hip_replacement" : { 
     "title" : "Hip Replacement" 
    } 
    }, 

    "providers" : { 
    "the_blue_hospital" : { 
     "title" : "The Blue Hospital" 
    } 
    } 
} 

난 당신이 엉덩이 교체 페이지를 방문하면, 푸른 병원이 아래에 표시 할 수 있도록 당신이 경우,이 두 항목을 연결하고 싶습니다 The Blue Hospital 페이지를 방문하면 엉덩이 교체가 그 밑에 나타납니다. 본질적으로 양방향 관계.

이런 식으로 구성하는 가장 좋은 방법은 무엇입니까? 다음 줄을 생각해 보았습니다.

{ 
    "services": { 
    "hip_replacement": { 
     "title": "Hip Replacement", 
     "providers": { 
     "the_blue_hospital": true, 
     "the_red_hospital": true 
     } 
    }, 
    ... 
    }, 
    "providers": { 
    "the_blue_hospital": { 
     "title": "The Blue Hospital", 
    }, 
    "the_red_hospital": {... 
    }, 
    "the_green_hospital": {... 
    } 
    } 
} 

더 좋은 해결책을 얻으려면 더 좋은 방법이 있습니까? 어떤 도움을 주셔서 감사합니다. 사전에

감사합니다!

+0

그건 할 수있는 것처럼 보이지만, 분명히 더 나빠질 수 있습니다. :) 각 서비스 및 공급자 차원에서 얼마나 많은 데이터를 예상합니까? 읽기와 반대로 작성/삭제 작업은 얼마나 자주 수행됩니까? – James

+0

@JamesWing 각 차원에서 알맞은 양의 데이터 (10-12). 2-3 레벨보다 깊지 않습니다. 왜 물어 보니? 많은 양의 데이터를 처리 할 때 더 좋은 방법이 있습니까? – realph

+0

나는 클라이언트가 모든 종류의 "조인"테이블에서 모든 데이터를로드하게하는 반대의 생각을하고있었습니다. 수백 개의 작은 레코드가 있으면 매우 유용 할 수 있습니다. – James

답변

9

Firebase에서 조인 된 데이터의 문제점은 특정 읽기 또는 업데이트 유스 케이스를 다른 사용자의 비용으로 최적화하는 것입니다. 위의 샘플에서 서비스와 공급자 간의 관계를 만들거나 삭제하려면 각 "테이블"에 대해 두 가지 별도의 업데이트가 필요합니다. 정말 그다지 틀린 것은 없지만, 이것이 유일한 방법은 아닙니다.

적당한 크기의 데이터 세트의 경우, 관계형 DB 환경에서 수행 될 수있는 것과 유사한 서비스를 제공자에 맵핑하는 "결합 테이블"을 가질 수 있습니다. 데이터는 다음과 같이 보일 수 있습니다

{ 
    "services": { 
    "hip_replacement": {} 
    }, 
    "providers": { 
    "the_blue_hospital": {...}, 
    "the_red_hospital": {...}, 
    "the_green_hospital": {...} 
    }, 
    "serviceProviders": { 
    "-JqD5JX0RUDTXsu7Ok3R": { 
     "provider": "the_blue_hospital", 
     "service": "hip_replacement" 
    } 
    "-JqDoKfyJqPkQlCXDvFM": { 
     "provider": "the_green_hospital", 
     "service": "hip_replacement" 
    } 
    "-JbE7Ji_JRz2bHgBdMWQ": { 
     "provider": "the_blue_hospital", 
     "service": "hip_replacement" 
    } 
} 

이 방법의 장점과 단점이 있습니다

프로

  • 쉬운 삭제 한 곳
  • 쉬운에 매핑을 추가 할 수는 한 곳에서의 매핑
  • 단일 공급 업체의 컨텍스트를 넘어서는 표시를 위해 데이터를 다시 포맷 할 수있는 유연한 옵션 또는 색인과 같은 서비스.

  • 당신은 전체 데이터 세트를로드 할 수 있습니다. 파이어베이스는 키 안에서 필터링 할 수 없으며 클라이언트는 전체 목록을로드 한 다음 메모리에서 필터링해야합니다. 어쨌든, 어쩌면 저급한 수천 건의 기록에 대해 이것이 제대로 작동 할 것으로 생각됩니다.
  • 목록을 필터링하여 실제 서비스 및 공급자 데이터와 병합하려면 일부 클라이언트 작업을 수행해야합니다. 다시 말하지만 데이터 세트가 너무 크지 않다면 밑줄/대다수 groupBy()가이를 간단히 처리 할 수 ​​있습니다.

당신은 고려해야합니다

  • 당신이 얼마나 업데이트 및 삭제를 할 것인가?
  • 정말 가입 정보가 간단합니까?조인 테이블에 대한 유지 관리를 제안한 것보다 더 복잡하게 만드는 레코드 (표시 이름, 가격 등)가 더 필요합니까?
+0

"Firebase는 키없이 필터링 할 수 없습니다."라는 의미가 확실하지 않습니다. [query] (https://www.firebase.com/docs/web/guide/retrieving-data.html)를 사용하여 단순히 'orderByChild ('service '). equalTo ('hip_replacement ')'또는 이에 상응하는 op를 수행 할 수 있습니까? # section-queries)? – Kato

+0

serviceProvider 항목이 위에 표시된 것처럼 간단 할 때 가능합니다. – James

+0

답장을 보내 주시면 죄송합니다. 이 접근 방식을 취한다고 가정 해 봅시다. '제공자/서비스'의 데이터와 '서비스 제공자'의 데이터 사이의 업데이트를 유지하기가 어려울까요? "the_blue_hospital"의 이름이 "the_sky_blue_hospital"로 변경되었다고 가정 해 봅시다. 아직 두 곳에서 업데이트해야합니까? – realph