2016-08-29 4 views
0

저는 CouchDBNoSQL 신입생이며 배경은 SQL입니다. 내가 예를 들어 나는CouchDB 참조 무결성

{ 
    type: "product" 
    name: "Sweet Necklace" 
    category: "necklace" 
} 

아래와 같이 제품 문서가 각 범주는 그냥 인수를 위해 자신의 문서

{ 
    type: "category", 
    name: "necklace", 
    custom_attr: ".." 
} 

를 참조 무결성에 대한 몇 가지 질문이 어떤 때 일어나는 이해 관계자가 범주를 "목걸이"에서 "액세서리"로 바꾸기로 결정한 경우 범주 필드가 "목걸이"로 설정된 제품에서 어떤 일이 발생해야합니까? 목걸이와 동일한 카테고리의 모든 제품에 대해 일괄 업데이트를 수행합니까? (나는 CouchDB 생각하지 않습니다 우리가 "ALL UPDATE WHERE"는을 수행 할 수 있습니다 좀 문)

이러한 상황을 처리하기에 가장 좋은 방법은 무엇입니까?

P/S : 나는 NoSQL 어쨌든 비정규을 장려하기 때문에 대신 범주 ID의 제품 문서에 카테고리 이름을 저장하기로 결정했습니다.

답변

0

카테고리에 대한 별도의 문서를 유지 관리하는 경우 데이터를 비정규 화하지 않은 것입니다. 사실, 당신이하고있는 일을함으로써, 당신은 정상화도 비정규 화도없이 두 세계 모두 최악의 상황에 처하게됩니다. 이 같은

시도 뭔가 :

제품 문서 :

{ 
    _id:"product:first_product", 
    name:"First Product" 
    category:"category:category_1" 
} 

분류 문서 : 당신이 카테고리의 이름을 변경할 때

{ 
    _id:"category:category_1", 
    name:"Category 1", 
    custom_attr: {} 
} 

이 방법, 당신은 여전히 ​​

을 참조하고 이 카테고리가있는 모든 제품 문서의 올바른 문서로 이동하십시오.

참고 : 여전히 type 필드를 가질 수 있으며 _id을 현재 그대로 유지할 수 있습니다.

편집 :

제품/카테고리 정보를 얻으려면, 당신과 같이지도 기능을 정의 할 수 있습니다 : 당신이보기를 사용할 때마다 지금

function(doc){ 
    if(doc.id.indexOf('product:') === 0){ 
    // or if(doc.type === 'product') if you use the type field 

    emit(doc, {'_id': doc.category}); 

    } 
} 

을 당신은 참으로 include_docs를 설정하십시오 카테고리 정보가 결과에 포함됩니다.

+0

예를 들어 제품 카테고리 이름이 필요할 때마다 카테고리 컬렉션을 쿼리해야합니다. 조인을 제거하는 NoSQL의 목적 중 하나를 이룰 수 있다고 생각했습니다. –

+0

아니요, 다른 요청을 실행할 필요가 없습니다. 예를 들어 답변을 업데이트했습니다. – Kul