2009-12-23 3 views
12

저는 CouchDB를 처음 사용하고 그것에 대해 배우고 있습니다. 참조 무결성을 위해 CouchDB를 지원하지 않았다. CouchDB 문서에서 필드의 외래 키를 만들 수 있습니까?CouchDB는 참조 무결성을 지원합니까?

예 : 주문 문서에 사용 된 공급 업체 이름을 공급 업체 데이터베이스에서 사용할 수 있는지 확인하는 것이 가능합니까?

CouchDB는 참조 무결성을 지원합니까? 그리고 문서에서 기본 키로 필드를 만들 수 있습니까?

답변

11

아니요, CouchDB는 외래 키를 그렇게하지 않으므로 시스템의 참조 무결성을 처리 할 수 ​​없습니다. 응용 프로그램 수준에서 공급 업체 확인을 처리해야합니다.

필드를 기본 키로 만들 수 있는지 여부는 기본 키가 _id 필드이지만 유효한 json을 db의 뷰에 대한 키로 사용할 수 있습니다. 예를 들어 공급 업체를 키로하여 주문 뷰를 작성할 수 있습니다.

function(doc) { 
    if (doc.type == 'order') 
    emit(doc.vendor,doc); 
} 

같은

뭔가 값 순서와 유형 속성을 가지고 키로 그들의 공급 업체를 사용하여보기에 추가 데이터베이스에있는 모든 문서를 잡아 것입니다.

Intro to CouchDB views

8

이러한 질문은 매우 관계형 데이터베이스가 다릅니다.

CouchDB 또는 다른 비 RDBMS에서 RDBMS에서와 같은 방식으로 데이터를 저장하지 않으므로 이러한 방식으로 관계를 설계하는 것이 좋지 않을 수 있습니다. 그러나 당신이 어떻게 할 수 있는지에 대한 아이디어를주기 위해서, 당신은 벤더를위한 문서를 가지고 있다고 가정하고, 벤더 문서에 다시 "관련시킬"필요가있는 명령들에 대한 문서들을 가지고 있다고 가정합니다.

기본 키가 없으며 문서에 _id (uid)가 있습니다. 공급 업체 용 문서가 있고 주문과 같은 내용을 위해 새 문서를 만드는 경우 공급 업체 문서 _id를 참조 할 수 있습니다.

{"type":"order","vendor-id":"asd7d7f6ds76f7d7s"} 

는 같은지도보기 뭔가 것 특정 공급 업체에 대한 모든 주문을 조회하려면, 거기에 "무결성"이 때문에,

function(doc) { if (doc.type == 'order') {emit(doc['vendor-id'], doc)}} 

문서 _id가 변경되지 않습니다를 경우에도 마찬가지 이름 또는 청구 정보와 같이 공급 업체 문서의 다른 속성을 변경하십시오. 벤더 문서의 공급 업체 이름이나 다른 속성을 주문 문서에 직접 붙여 넣는 경우 대량으로 변경하려는 경우 스크립트를 작성해야합니다.

희망이 조금 있습니다.

+2

참조 무결성은 즉, 할 - 그것 - 스스로입니다. 프로그래머는 먼저 공급 업체 문서를 만든 다음 ** _ id **를 참조하는 항목을 작성해야합니다. 왜냐하면 CouchDB에서 해당 항목을 시행 할 수 없기 때문입니다. 마찬가지로 삭제시 프로그래머는 공급 업체를 제거하기 전에 공급 업체와 관련된 주문을 먼저 삭제해야한다는 것을 기억해야합니다. CouchDB는 해당 업체를 위해 그렇게하지 않습니다. 그래서 CouchDB는 일관성없는 상태로 계속해서 나아갈 것입니다. 그것에 대한 보호를지지하지 않습니다. –

+0

이 경우 상태가 제거 될 다른 문서의 참조이므로 "불일치 상태"라는 참조가없는 매달린 문서는 호출하지 않습니다. 그러나 여기서의 의미에 대한 귀하의 특성은 정확합니다. 참조는 색인 일 뿐이며 문서를 제거해도 이전 참조를 정리하지만 나중에 참조를 정리하는 더 큰 트랜잭션을 유추하지 않습니다. – mikeal

+0

더 중요한 것은 couchdb 서버가 REST-3을 사용할 수 있다는 것입니다 (디자인 문서로 원하면 REST-4 기능을 빌드 할 수 있습니다). "참조 무결성"이라는 용어를 적용하면 비디오 게임보다 문서 데이터베이스가 더 이상 적합하지 않습니다. 그것은 관계형 데이터베이스가 아니며 가장하지 않습니다. –

0

동안 가능하지 않은 FK 제약 조건을 만들려면, 그것은, 그들은 통화를 할 수있다 (아니에요) 사람이 정말 영리 있다면, 이제 소파의 Validate 기능

function(newDoc, oldDoc, userCtx, secObj) { 
    if(newDoc && newDoc.type) switch(newDoc.type){ 
     case 'fish': 
      var allSpecies = ['trout','goldfish']; 
      if(!allSpecies.contains(newDoc.species)){ 
       throw({forbidden : 'fish must be of a know species'}); 
      } 
      break; 
     case 'mammals': 
      if(!['M','F'].contains(newDoc.sex)){ 
       throw({forbidden : 'mammals must have their sex listed'}); 
      } 
      break; 
    } 
} 

를 사용 가능하다 종 (Species) 목록의 DB 자체는 외래 키입니다.

당신은 또한에 읽어 할 수 있습니다 : How do I DRY up my CouchDB views?