2011-08-27 5 views
2

주석에 표시된대로. 나는 회원 문서를 여러 권 갖고 있는데, 각 사용자가 자신의 문서에있는 전자 메일 필드를 원하는대로 (예 : 다른 문서에있는 전자 메일) 설정할 수 있기를 바랍니다. 체크 인서트 만하면 경쟁 조건에 취약합니다. "locking"또는 insertion-then-checking에 대한 관용구가 있습니까?CouchDB 문서에서 필드의 고유성을 어떻게 보장합니까?

답변

2

유일한 확실한 방법은 doc id로 고유 값을 가진 문서를 만드는 것입니다.

+0

흠, 그래서이 필드를 설정 할 때마다 먼저 때문에 위의 예'회원 - 이메일 - 헨릭의 @ 야후의 핵심 (의 정식 버전을 생성하기로 작동합니다. com') 그 이름으로 빈 문서를 만든 다음 필드가 변경된 경우 삭제하십시오. – Malvolio

+0

예, 그 방법은 작동 할 것입니다 –

1

다른 답변 노트와 같이 CouchDB에서 유일해야한다는 유일한 필드는 _id입니다.

여기에서 리플리케이터에서 트릭을 빌릴 수 있습니다. 동일한 두 호스트간에 두 번째 복제를 빨리 감기 위해 마지막으로 도달 한 업데이트 순서를 기록하는 검사 점 문서를 작성합니다. 그러나 앞으로 검사 점 문서를 어떻게 찾을 수 있습니까? 그렇게.

"_id"MD5 (source.host source.port + + + target.host target.port)

고유 ID 필드는 그 자체의 일부를 형성하고 여기서 일반적인 패턴을 추출 할 수있다. md5를 통해이를 실행하면 고정 길이 식별자가 보장됩니다.

귀하의 경우 귀하의 ID로 이메일 주소를 사용할 수 있습니다.

이러한 필드 중 하나를 변경하는 것은 두 단계 프로세스이지만 고유성 속성을 유지 관리하는 프로세스입니다.

  1. 복사 새로운 아이디 (http://wiki.apache.org/couchdb/HTTP_Document_API#COPY)
  2. 성공하면에 대한 문서는 이전 (http://wiki.apache.org 삭제/couchdb/HTTP_Document_API # DELETE)

1 단계와 2 단계 사이에 충돌이 발생하면 이전 문서가 그대로 남아 있으므로 새 문서에서 이전 문서에 대한 참조를 추가 할 수 있습니다. 그런 다음 해당 참조의 뷰를 작성하고 정기적으로 정리 스윕을 수행 할 수 있습니다.

모두 CouchDB는 정교한 관계형 제약 조건을 지원할 수있는 일반적인 RDBMS와 달리 클러스터에서만 명확하게 확장 할 수있는 고유 한 필드 하나만을 의도적으로 지원합니다 (c.f, BigCouch). 전자 메일 주소가 고유해야하는 귀하의 경우, 내가 말한 많은 내용이 작동해야합니다 (전자 메일 주소는 자주 변경되지 않습니다). 그러나 분명히이 업스트림을 어느 정도까지 수영하고 있습니다.

HTH, B.

+0

내 현재 계획은 전자 메일 주소를 키로 사용하고 현재 시간을 유일한 값으로 사용하는 * 임시 * 고유성 테이블을 사용하는 것입니다. 단계는 (a) 고유 항목 작성, (b) 전자 메일로 주요 항목 검색 (어쨌든보기가 필요함), (c) 새 기본 항목 작성, (d) 고유 항목 삭제. 독자가 각 실패 사례를 적절하게 처리하는 것은 연습 과제로 남겨 둡니다. – Malvolio

+0

(d)를하지 않으면 (b) 할 필요가 없습니다. – OrangeDog

관련 문제