2009-08-26 15 views
21

다음은 (샘플 문서 유형으로 "예"을 사용) 버전을 구현하기위한 실행 가능한 전략이 될 것이다 :CouchDB를 버전 관리 전략

이 유형의 필드가 example_original이라는 하나의 원본 문서를 가지고.

문서의 후속 변경 사항은 모두 example_change 유형이고 example_original 문서의 ID는 키입니다. 변경에는 타임 스탬프도 포함됩니다.

모든 example_change가 "적용"된 example_original의 결과 인 example_current 유형의 문서 하나를 유지하십시오. 새로운 example_change 문서가 자동으로이 문서에 적용됩니다.

특정 버전을 찾는 것은 example_original doc을 검색하고 원하는 변경 사항을 적용하는 것으로 구성됩니다 (주로 특정 타임 스탬프까지만 가능하지만 많은 변경 사항 일 수 있음).

필자의 경우에는 원본을 제한적으로 변경해야한다는 점을 언급해야합니다. 대부분의 업데이트는 새로운 원본 문서로 구성됩니다. 이것이 현재 나의 유스 케이스 인 반면 많은 부분이 변경 될 경우 발생할 수있는 문제에도 관심이있을 것입니다.

이 접근 방식에서 어떤 장단점이 있습니까?

+0

문서 내용이나 문서 구조의 버전을 변경하려고하십니까? – Dokie

+0

콘텐츠 만. 입력란은 삭제되지 않습니다. – mac

답변

9

내 첫 번째 걱정은 : 특정 버전을 "가져 오는"경우 데이터베이스를 수정하지 않고 변경 내용을 원본에 적용 할 수 있습니까?

기록에서 무언가를 삭제해야합니까? 정말 확실하니? 정말로, 정말로? 분기는 어때?

이 모든 것이 복잡한 전략처럼 보입니다. CouchDB에 대해서는 들어 본 적이 있지만 사용하지 않았다는 것을 명심하십시오. 좀 더 간단한 방법을 생각해 보겠습니다.

  1. 문서를 만들 때 UUID를 할당합니다. 이름을 사용하지 마십시오. 이름 바꾸기 작업 중에 문제가 발생합니다. "1"을 나타내는 버전 필드를 추가하십시오. 동일한 UUID를 가진 문서 목록을 포함하는 두 번째 문서를 만들거나 첫 번째 문서에 "상위"포인터를 추가하십시오.

    문서 당 "기록 문서"를 사용하면 기록을 더 빨리 탐색 할 수 있지만 부모 포인터는 더 안전합니다 (불법 구조를 쉽게 만들 수 없으므로).

  2. 새 개정판을 작성할 때 UUID를 다시 사용하고 새 고유 버전을 지정하십시오. 내역 문서 또는 상위 포인터를 업데이트하십시오.

이 전략은 구현하기가 매우 쉽고 모든 종류의 유연성을 나중에 허용합니다. 기록의 일부를 쉽게 지울 수 있고, 이름 바꾸기는 간단하며 분기를 만들 수 있습니다.

+0

의견을 보내 주셔서 감사합니다. 내역에서 어떤 것을 삭제할 필요는 없지만 일부 변경 사항은 "오류"또는 유사한 것으로 표시 될 수 있습니다. 분기 지원은 필요하지 않습니다. – mac

1

이 문서의 비즈니스 상태는 무엇입니까? 특히 법적으로 무엇입니까? 저는 v.3에서 제시 한 문서가 실제로 문서의 버전 3임을 증명할 필요가 있기 때문에 귀하의 제안이 비즈니스 관점에서 적절하지 않은 상황에서 일했습니다. 동적으로 델타를 적용해도 규정 준수 겨자가 절단되지는 않습니다.

전체적으로 문서 대신 델타를 저장하여 많은 디스크 공간을 절약 할 수는 없습니다. 전체 문서를 저장하면 모든 문서의 검색 시간을 신뢰할 수있게 예측할 수 있습니다. 또한 검색 프로세스의 복잡성을 줄여줍니다.

+0

변경 사항 문서를 포함한 모든 문서에 대한 감사 로그가있는 한 준수 문제가 있다고 생각하지 않습니다. 이 접근법은 원래의 계약 및 이후 개정안과 유사합니다. – mac

1

CouchDB를 사용하여 버전을 관리하기위한 전략은 전체 히스토리를 유지해야하는 문서가 포함 된 데이터베이스를 절대 압축하지 않는 것입니다. 당신은 여전히 ​​다른 데이터베이스를 압축 할 수 있습니다. 이 간단한 전략은 편집 충돌 해결 전략으로 즉시 사용할 수 있습니다.

내용을 삭제하고 속성 집합을 삭제 한 새 버전을 작성하여 문서를 삭제할 수 있습니다.

버전 관리 메커니즘이 단일 수정 스레드를 제공하기 때문에 이러한 방식으로 분기를 수행 할 수 없습니다.

지금 CouchDB를의 가능한 미래 :

  • 오늘 각 버전은 문서의 전체 사본을 보유하고 있지만, 하나는이 CouchDB를 엔진의 최적화 할 수 일일 스토어 델타를 생각 할 수있다.
  • 향후 CouchDB가 특정 문서 유형의 압축을 막기위한 API를 제공 할 수도 있습니다. 이렇게하면 모든 문서를 동일한 데이터베이스에 보관할 수 있습니다. 이것은 CouchDB에 쉬운 패치 일 것입니다.
  • 이 전략은 문서 분기 관리를 가능하게하지만 CouchDB의 성격을 문서 데이터베이스로 고려하면 합리적이지만 장기적인 가능성이 있습니다.
+0

재미있는 아이디어이지만 좋은 충고는 아닙니다. 간단히 압축을 피함으로써 매우 간단한 버전 관리 시스템을 구현할 수 있지만, 작업하는 대신 데이터베이스에 대해 작업하게됩니다. 데이터베이스가 저장해야한다는 것을 알 수 있도록 다른 _id로 유지하려는 각 버전을 저장하는 것이 더 좋습니다. –

+0

@NickPerkins, 필자는 구체적으로 "데이터베이스"를 압축하지 않겠다는 언급을 들었습니다. 이는 사용자가 여전히 압축 할 수있는 하나 이상의 다른 데이터베이스를 가질 수 있음을 의미합니다. 따라서이 솔루션은 데이터베이스에 대해 작동하지 않습니다. –

19

Simple Document Versioning with CouchDB

첨부 파일 버전 관리를 위해 대부분의 사람들의 요구에 맞게해야이 문서에서 설명하는 방법과 같이 버전.

+2

링크가 더 이상 존재하지 않지만 [this one] (http://jchris.ic.ht/drl/_design/sofa/_list/post/post-page?startkey=%5B%22Versioning-docs-in-CouchDB % 22 % 5D) 설명 된 4 가지 방법에 대한 개요가 포함되어 있습니다 –

+0

업데이트 된 링크입니다 (https://blog.couchbase.com/how-implement-document-versioning-couchbase) –

+0

@BrianPutt : CouchDB와는 다른 CouchBase에 대해 이야기하고 있습니다. http://www.couchbase.com/couchbase-vs-couchdb –