좋은 질문입니다. 나는 이것도 직접 조사하고있었습니다.
변경 될 때마다 새 버전을 만듭니다.
Ruby 용 Mongoid 드라이버 의 버전 관리 모듈 을 발견했습니다. 나는 그것을 직접 사용하지는 않았지만 찾을 수있는 것에서 각 문서에 버전 번호를 추가합니다. 이전 버전은 문서 자체에 포함되어 있습니다. 가장 큰 단점은 변경 될 때마다 전체 문서가 복제 되어 큰 문서를 처리 할 때 많은 중복 컨텐츠가 저장된다는 것입니다. 이 방법은 작은 크기의 문서를 처리하거나 문서를 자주 업데이트하지 않는 경우에 좋습니다.
변경 사항을 새 버전으로 만 저장
또 다른 방법은 변경된 필드 만 새 버전 으로 저장 하는 것 입니다. 그런 다음 내역을 '평평하게'하여 모든 버전의 문서를 재구성 할 수 있습니다. 그러나 모델의 변경 사항을 추적하고 응용 프로그램이 최신 문서를 재구성 할 수있는 방식으로 업데이트 및 삭제를 저장해야하기 때문에 다소 복잡합니다. 플랫 SQL 테이블이 아닌 구조화 된 문서를 처리 할 때 까다로울 수 있습니다.
문서 내에 변경 사항 저장
각 필드에는 개별 기록이있을 수 있습니다. 이 방법으로 문서를 지정된 버전으로 재구성하는 것이 훨씬 쉽습니다. 애플리케이션에서 변경 사항을 명시 적으로 추적 할 필요는 없지만 값을 변경할 때 새 버전의 특성을 작성하기 만하면됩니다. 문서는 다음과 같이 보일 수 있습니다.
{
_id: "4c6b9456f61f000000007ba6"
title: [
{ version: 1, value: "Hello world" },
{ version: 6, value: "Foo" }
],
body: [
{ version: 1, value: "Is this thing on?" },
{ version: 2, value: "What should I write?" },
{ version: 6, value: "This is the new body" }
],
tags: [
{ version: 1, value: [ "test", "trivial" ] },
{ version: 6, value: [ "foo", "test" ] }
],
comments: [
{
author: "joe", // Unversioned field
body: [
{ version: 3, value: "Something cool" }
]
},
{
author: "xxx",
body: [
{ version: 4, value: "Spam" },
{ version: 5, deleted: true }
]
},
{
author: "jim",
body: [
{ version: 7, value: "Not bad" },
{ version: 8, value: "Not bad at all" }
]
}
]
}
버전에서 삭제 된 것으로 문서의 일부를 표시하는 것은 여전히 다소 어색합니다. state
애플리케이션에서 삭제 / 복원 할 수있는 부품 필드를 소개 할 수 있습니다.
{
author: "xxx",
body: [
{ version: 4, value: "Spam" }
],
state: [
{ version: 4, deleted: false },
{ version: 5, deleted: true }
]
}
이러한 각 접근 방식을 사용하면 하나의 컬렉션에 최신의 병합 된 버전을 저장하고 별도의 컬렉션에 기록 데이터를 저장할 수 있습니다. 최신 버전의 문서에만 관심이있는 경우 쿼리 시간이 향상됩니다. 그러나 최신 버전과 기록 데이터가 모두 필요한 경우 하나가 아닌 두 개의 쿼리를 수행해야합니다. 따라서 단일 컬렉션과 두 개의 개별 컬렉션 중 어느 것을 사용할지는 응용 프로그램에 이전 버전이 필요한 빈도에 따라 달라집니다 .
이 답변의 대부분은 내 생각의 두뇌 덤프 일뿐입니다. 실제로는 아직 시도하지 않았습니다. 이를 되돌아 보면, 첫 번째 옵션은 아마도 중복 데이터의 오버 헤드가 애플리케이션에 매우 중요하지 않은 한 가장 쉽고 최상의 솔루션 일 것입니다. 두 번째 옵션은 매우 복잡하며 아마도 노력할 가치가 없습니다. 세 번째 옵션은 기본적으로 옵션 2의 최적화이며 구현하기가 쉽지만 실제로 옵션 1을 사용할 수 없다면 구현 노력의 가치가 없습니다.
이 문제에 대한 피드백과 다른 사람들의 문제에 대한 해결책을 기대합니다 :)