2009-11-04 2 views
3

CouchDB에서 데이터베이스를 중첩 할 수없는 것 같습니다. 이 제한을두고 사람들은 어떻게 작동합니까? 예를 들어 각 도메인에 별도의 데이터베이스가있는 블로깅 엔진을 만들고 싶다고 가정합니다. 각 데이터베이스 내에서 사용자 데이터베이스, 주문 데이터베이스 등이 다양한 사용자 문서, 주문 문서 등을 포함하기를 원할 수 있습니다.CouchDB의 중첩 데이터베이스

확실한 방법은 데이터베이스 이름이 하이픈으로 데이터베이스 중첩 수준의 인공 경계를 구분한다 평면 구조를 보인다 :

myblog.com-users 
myblog.com-posts 
myblog.com-comments 
anotherblog.com-users 
anotherblog.com-posts 
anotherblog.com-comments 
...hundreds more... 

또 다른 해결책은 낮은 레벨의 데이터베이스를 유지하고 각을 표시하는 것 최상위 값 문서화

사용자 문서 User1에 함유 데이터베이스 필드 인스턴스 = "테스트" 또는 필드 domain = "myblog.com"

답변

6

나는 여기서 용어 데이터베이스를 오용하고 있다고 생각합니다. 사용자, 게시물 및 주석 데이터를 단일 couchdb 데이터베이스에 저장할 수있는 이유가 없습니다. couchdb 뷰는 사용자 문서를 주석 문서의 게시물 문서에서 분리 할 수 ​​있습니다. CouchDB를 데이터베이스에서 사용자 문서에 대한

예지도 기능 :

function(doc) { 
    if (doc.type = 'user') { // only return user documents 
    emit([doc.domain, doc.id], doc); // the returned docs will be sorted by domain 
    } 
} 

이보기 정렬과 startkey 및 endkey를 사용하여 도메인에 의한 조회 결과를 제한 할 수있는 방법을 View Api를 참조하십시오.

+1

사실 나는 당신이 데이터베이스라는 용어를 오용하고 있다고 생각합니다. CouchDB : The Definitive Guid : "CouchDB는 데이터베이스 관리 시스템 (DMS)이므로 여러 데이터베이스를 보유 할 수 있으며 데이터베이스는 관련 데이터를 저장하는 버킷입니다." 내 질문에 데이터베이스를 참조 할 때 CouchDB DMS의 여러 인스턴스를 언급하는 것이 아니라 관련 데이터를 보유하는 여러 버킷을 참조합니다. 데이터베이스 (버킷)는 관련 데이터를 보유하기위한 것이므로 모든 도메인의 주문에 대한 버켓을 가질 수 있으며 단일 도메인의 사용자 및 주문에 대한 버킷을 가질 수 있습니다. – rcampbell

+0

전문 용어 외에 뷰를 사용하여 사용자 문서, 게시물 문서 및 주석 문서를 분리하는 것이 각 문서에 대한 구분자 키/값 쌍을 사용하는 것이 좋습니다. 나에게 그것은 Post.domain = MyApp, User.domain = MyApp, Comment.domain = MyApp 등등을 말해야 만하는 해킹처럼 느껴진다. 많은 데이터 중복. 또한 모든 클라이언트 데이터를 함께 그룹화하는 것이 보안 상 잘못 생각됩니다. 뷰의 취약점으로 인해 한 클라이언트가 다른 클라이언트의 데이터에 노출 될 수 있습니다. – rcampbell

+2

아마도 내 부분에 잘못된 단어를 선택했습니다. 제 의견은 당신이 게시물 주석과 사용자를 모두 하나의 데이터베이스에 넣고 싶다면 완벽합니다. 도메인 당 데이터베이스를 갖는 것이 좋습니다. 그러나 게시 및 주석 문서를 대조하거나 합치려면 동일한 데이터베이스에 모두 보관하는 것이 더 쉬울 것입니다. –

3

난 최선의 해결책은 각 도메인 특정 데이터를 저장하는 도메인 당 하나의 데이터베이스를 가지고 있다고 생각합니다.

관련 문제