CouchDB 및 문서 버전 관리


12

현재 CouchDB를 사용하여 wiki-esque 응용 프로그램을 작성 중이며 문서 버전 관리 체계를 구현하려고합니다. 내가 보는 방식에는 두 가지 방법이 있습니다.

  1. 각 버전을 별도의 문서로 저장
  2. 이전 버전을 단일 문서의 첨부 파일로 저장하십시오.

지금은 # 1이 작동하는 형태입니다. 사용자가 문서를 편집하고 저장하면 백엔드는 먼저 이전 개정을 새 문서에 복사 한 다음 새 버전을 저장합니다. 각 문서에는 각 버전 (이전 버전의 문서 _id, 타임 스탬프, 편집기 등)에 대한 데이터가 포함 된 '이력'배열이 있습니다.

이 히스토리 배열은 자주 업데이트되는 문서의 경우 상당히 길어질 수 있으므로 일반 읽기 중에 문서 산 내역을 가져 오는보기 (및 내역을 가져 오기위한 다른보기)가 있습니다.

내 질문은 이것입니다 : 나는 현재의 접근 방식에 대해 불안감을 느끼고 '첨부 파일'방법으로 변경하는 것에 대해 생각하고 있습니다. 그러나 나는 확실하지 않다. 나는 CouchDB를 아는 사람이 나보다 나아지기를 바라고있다 (나는 몇 주 동안이 일을했다. 접근하다. 아니면 내가 간과하고있는 다른 버전 관리 체계가 있습니까?


2
성능에 전혀 영향을 줄 수는 없지만 사용중인 시스템은 CouchDB와 "영적"입니다. 이전 버전을 응답 계층으로 저장하는 것은 Lotus Notes 문서 데이터베이스 (NSF) 인 CouchDB의 "영적 조상"에서와 같이 관용적입니다 (Damien Katz는 다른 것을 개발하기 전에 한 가지에 대해 깊이 연구하여 최선을 유지하고 개선했습니다) cruft 및 backward / bugward 호환성 요구 사항을 던지면서 더 많은 기본적인 구조적 질문에 대한 답변이 Notes에있을 것입니다.)

답변:


2

오래된 문서를 별도의 문서로 저장하거나 데이터베이스의 최종 개정판에 첨부 파일을 저장하면 데이터베이스 서버에 오버 헤드가 발생하므로 변경 사항 만 저장하는 것이 좋습니다.

문서에서 키 값을 변경할 때마다이라는 새 키를 추가하십시오 _h_i_s_<key_name>. 새로 생성 된 (또는 마지막 업데이트 중에 생성 된) 모든 편집 / 업데이트 후에 아래와 같은 객체를 추가하십시오.

{
key_name: "Hello",
_h_i_s_key_name:{time_of_update:value_of_key_name_before_update},
....
}

또는

    {
    key_name: "Hello",
    _h_i_s_key_name:[{time:time_of_update,value:value_of_key_name_before_update}, {time:time_of_last_update,value:value_of_key_name_before_last_update}],
    ....
    }

이 접근 방식은 장기적으로 많은 디스크 공간과 복제 대역폭을 절약합니다.


0

CouchDB에 대한 지식이 없습니다. 모든 버전을 저장하는 것은 이전 버전과는 조금 다를 수 있지만 스토리지 낭비입니다. 변경 사항 만 저장하는 것이 좋습니다.

여기를 보거나 데이터 버전을 검색 할 수 있습니다 .


이 답변은 옵션 1 (별도의 문서) 또는 2 (문서의 일부) 중 어느 것이 더 낫다고 말하지 않습니다.
binki

0

몇 년 후 ;-)

CouchDB가 대신 변경 사항을 저장하지 않아도됩니다. 문서가 변경되면 새 개정이 작성됩니다. 이 문서는 실제로는 같지만 _id새 문서 _rev(교정본)를 가진 다른 문서이며 디스크의 공간을 소비합니다.

확실히 모든 개정판을 유지해야한다는 것은 매우 큰 디스크가 필요하다는 것을 의미합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.