2009-03-03 4 views
3

내가 얼랑로 Mnesia를 사용하고 있지만,이 문제는 CouchDB를 같은 임의의 키 - 값 DB에 적용, 등키 - 값 데이터베이스에서 중첩 된 항목을 효율적으로 쿼리하기 위해 스키마를 어떻게 디자인합니까?

나는 RDBMS 프로세스를 생각의 자유 휴식하려고 해요,하지만 난 쌀 수 없습니다

내 이런 종류의 스키마를 효율적으로 구현하는 방법에 대해 머리를 맞 춥니 다.

내가 사용 기록이 말해, 그는 그렇게 많은 하위 항목의 B 기록, 가지고있는 많은 SubItemA 기록이 있습니다

나는 하위 항목 B.에 쿼리를 실행해야
User 
-SubItem A 
--SubItem B 
... 

그것을 할 효율적인가요를 때 이 중첩? 나는 그것을 정상화해야 더 빨리 될 것인가?

데이터 복제를 사용하는 사람들이 있다는 것을 들어 보았습니다. 데이터는 중첩되어 있고 분리되어 있습니다.이 말도 안되는거나 실제로 유용합니까? 몇 가지 사례가 있습니까?

답변

3

성능은 언제입니까 이 좋은가요?

실제로 모든 SubItem B를 자세하게 검사해야하고 B의 크기가 사전의 전체 크기를 지배해야하는 경우 사용자 사전을 테이블 스캔하는 것은 과도한 오버 헤드가 아닙니다.

그다지 좋지 않다면 SubItem B를 쿼리 할 때 모든 User 및 SubItem A 데이터를 앞에 두지 않도록 표준화하십시오. (UserId, SubItemAId, SubItemBId)와 같은 복합 키를 사용하십시오. SubItem B 사전에 테이블이 정렬되어 있으면 범위 쿼리를 수행 할 수 있습니다.

User/SubItem A 쿼리 성능을 완전히 없애면 오류가 발생하기 쉽기 때문에 마지막으로 데이터 중복을 고려하십시오.

1

CouchDb에서 각 SubItem에 대한보기 항목을 내보내는 것은 간단합니다. 이렇게하면 해당 항목에 매우 빠르게 액세스 할 수 있습니다. 보기 항목에 무엇을 넣는 지에 따라 부모 문서/하위 항목에 다시 연결하는 데 필요한 정보를 제공 할 수 있습니다.

1

Mnesia에 대해 잘 모르겠다. CouchDB를 처음 시작하는 것 뿐인데, 사용자 정의 인덱스 ("보기")를 생성했기 때문에 CouchDB에서 인덱스를 직접 작성할 수 있습니다. 그 하위 항목들.

예지도 기능 :

function(doc) { 
    for(var i in doc.subitems_a) { 
     var subitem_a = doc.subitems_a[i]; 

     for(var j in doc.subitems_a[item_a].subitems_b) { 
      var subitem_b = subitem_a.subitems_b[j]; 

      emit(subitem_b, doc) 
     } 
    } 
} 

효과적으로 하위 항목 조식의 인덱스 목록입니다 다음 잘라 당신이 선택으로 그 목록에서 스플 라이스 수 있습니다.

0

사실 내 생각에 사용하는 데이터베이스에 따라 다릅니다. CouchDB에서 한 가지는 더 잘 작동합니다. 반면에 Mnesia에서는 다른 것이 더 좋을 것입니다. 데이터를 분할하고 파쇄해야합니까? 어떤 기준으로 그렇게해야합니까? 얼마나 많은 데이터 복제가 충분합니까?

제프리 한틴 (Jeffery Hantin)이 말한 것처럼 적절한 해결책을 찾기 위해 몇 가지 실험과 분석을 수행 할 것이라고 말했습니다. 대부분의 비 관계형 데이터베이스는 문제를 해결하는 데 필요한 도구를 제공합니다. 귀하는 각자의 트레이드 오프와 트레이드 오프를 상대방과 비교하여 파악할 수 있습니다.