2011-01-24 6 views
3

CouchDB와 같은 문서 기반 데이터 저장소를 사용하면 큰 이익을 얻을 수있는 애플리케이션이있다. 그러나 Map Reduce를 구현하기 위해 애 쓰고있는 쿼리 유스 케이스가 있습니다.CouchDB에서 임의의 술어 쿼리를위한 전략

  1. 숫자는
  2. 부울 부울 본질적 속성을 하나 이상의 비 독점적 세트에 속하는 것으로 문서를 표시

속성 속성 :

우리의 문서는 정말 단지 두 가지 유형의 데이터를 포함 . 숫자 속성은 항상 합계 만 필요합니다.

이 구성에
{ 
    "id": 3123123, 
    "attr": {"x": 2, "y": 4, "z": 6}, 
    "sets": ["A", "B", "C"] 
} 

, 그것은 세트 A, B 및 C에 대한 집합 X, Y, Z 값을 작동하기 쉬운, 그러나 당신이 할 때 더 복잡해진다 : 문서를 구조화하는 한 가지 방법은 다음과 같이이다 A &과 같은 집합체를 볼 수 있습니다.

이 작은 경우 나는 ABC ("A, B, C, AB, AC, BC, ABC")의 모든 순열에 대해 키를 내보낼 수 있습니다. 이것이 어떻게 규모가 될지 걱정했습니다. 우리의 문서는 80 세트의 일부 조합에 속할 수 있으며 사용자 인터페이스를 통해 가능한 모든 조합을 구성 할 수 있습니다.

저는 이것이 CouchDB의 직업이 아니라고 생각합니다. 아마도 MongoDB 또는 다른 것이이 문제에 더 잘 맞을 것입니다.

나는 무엇이 있습니까?

답변

3

모든 값을 효율적으로 계산하고 캐시 할 수있는 데이터 구조는 매우 복잡 할 것입니다. 나는 어떤 데이터베이스 시스템이 부분 집합을 반복하지 않고 이것을 할 수 있는지 확신 할 수 없다. 교차로는 악명 높게 어려운 작업이며 CouchDB에는 교차점을 올바르게 처리하는 데 사용할 수있는 것이 없습니다.

올바르게 식별, 모든 순열을 (집합이 정확합니다) 여전히 거대한 배 항목을 곱 것 때문에 메모리 돼지가 될 것입니다 발광 (2 N 키 - 값 쌍에 대한 n 세트). CouchDB 키 구조를 사용하면 그룹 레벨 옵션을 사용하여 ["A","B","C"]을 내보낼 때 ["A"]["A","B"]의 값을 검색 할 수 있지만 2의 계수 (2 n-1 키 - 값) 만 사용하면 값을 줄일 수 있습니다. n 세트에 대한 쌍).

따라서 항목에 평균 세 개의 관련 세트가있는 경우 3 개가 아닌 4 개의 키 - 값 쌍이 좋지만 4 개의 관련 세트가 무거 우며 (4 개 대신 8 개) 5 개가 시작됩니다 짜증나게하기 (5 대신에 16). 또한 많은 관련 세트가있는 항목을 성능 문제에 취약하게 만듭니다 (10 세트 항목은 500 개 이상의 키 - 값 쌍을 생성합니다).

핵심적인 접근 방법은 길이가 4 세트까지의 키를 내보내고 (단지 필요한 메모리를 두 배로 늘림) 깊은 교차가 필요할 때 응용 프로그램 측 처리를 실행하는 것입니다 (축소하지 않고 모든 항목을 잡고, 감소). 운이 좋으면 관련 항목 수가 적어집니다. 그렇지 않은 경우 최대 설정 크기를 사용하여 성능 향상을 위해 더 많은 메모리를 희생 할 수 있습니다.

반대의 접근법은 모든 문서가 삽입/업데이트 될 때 (현재 항목의 하위 집합과 일치하는 모든 "합계"문서를 가져 와서) 응용 프로그램 업데이트 2 n을 합산하는 것입니다. 이러한 합계는 다른 데이터베이스에 저장되며 키로 쿼리됩니다. 이 방법은 쿼리를 신속하게 처리 할 수 ​​있도록 즉석에서 업데이트를 수행 할 수있는 경우 (또는 아키텍처에서 기본 데이터베이스의 업데이트를 수신하여 업데이트 할 수있는 경우) 더 좋습니다.

+0

감사의 말 Victor -이 시점에서 나는 멀티 키 인덱스가있는 MongoDB를 확인하려고 노력하고 있습니다. 그렇지 않으면 내가 소파로 시도 할 수있는 접근법은 세트 일치 횟수를 저장하고 가장 작은 세트를 클라이언트 측 축소를위한 기초로 사용하는 것입니다. 또는 당신이 말한대로, 아마 이것을 두 가지 조합 하위 집합으로 가져 가라. –