2012-03-16 5 views
11

저는 CouchDB에 대해 조금 읽었습니다. 나는 그것이 "추가 전용"이라는 사실에 정말로 흥미를 느끼고 있습니다. 그 오해 될 수 있지만 내가 알고있는 한,이 같은 비트를 작동합니다CouchDB에서 이전 데이터에 액세스 할 수 있습니까?

  • 데이터 ID 1의 이름을 가진 사용자가 "Cedrik 마틴"라고 말하는 DB 시간에 T0 추가됩니다

  • 묻는 질의 "ID 1 사용자의 이름이 무엇인지?" T1이 업데이트가 DB 텔링을 만들어 한 번에 반환 "Cedrik 마틴"

  • : "ID 하나의 이름을 가지고있는 사용자는 세드릭 마틴" (A 'C'로 'K'를 변경).

  • 다시 지금 "세드릭 마틴"를 반환

그것은 바보 같은 예,하지만 내가 이해하고 싶습니다 그것 때문에 "ID 1 사용자의 이름은 무엇인가"를 묻는 질의 CouchDB에 대한 근본적인 것. 업데이트가 DB의 끝에 APPEND를 사용하여 제작 된 것으로

는, 신는 "이 시간 T0이었다로"특별한 아무것도하지 않고 DB를 조회 할 수 있습니다?

나는 "시간 T0에서 ID 1에 사용자의 이름이었다 무엇?"CouchDB를 물어 봐도 될까요?

편집 첫 번째 대답은 매우 재미 있고 그래서 더 정확한 질문을 가지고 : 한 나는 "압축"아니에요으로 CouchDB를, 나는 어떻게 든 "referentially 투명"있는 쿼리를 작성 할 수 있습니다 ( 일 것입니다. 항상과 같은 결과가 나타 납니까? 예를 들어 나는"개정 연구에서 문서 D"쿼리 제가 DB를 압축 아니에요 나는 항상 한 다시 같은 대답을 얻을 보장 나는 경우?

+0

아마도이 링크는 유용합니다. http://wiki.apache.org/couchdb/HTTP_Document_API#Accessing_Previous_Revisions –

답변

26

아마도 CouchDB에서 가장 흔히 저지르는 실수는 데이터에 대한 버전 시스템을 제공한다고 생각하는 것입니다. 그렇지 않습니다.

압축은 모든 문서의 최신이 아닌 모든 개정을 제거하고 복제는 모든 문서의 최신 개정 만 복제합니다. 과거 버전이 필요한 경우, 당신에게 좋은 것으로 보이는 어떤 구성표를 사용하여 최신 버전에 보존해야합니다.

"_rev"는 언급 한 것처럼 불행한 이름이지만 더 명확한 다른 단어는 제안되지 않았습니다. "_mvcc"및 "_mcvv_token"은 이전에 제안되었습니다. 두 가지 문제는 그곳에서 벌어지고있는 일에 대한 설명이 필연적으로 "구 버전이 압축 될 때까지 디스크에 남아있다"는 것을 포함 할 것이며 이는 여전히 사용자 버전 시스템임을 의미합니다.

"CouchDB에게 물어볼 수 있습니까?"시간 t0에 ID 1을 가진 사용자의 이름은 무엇입니까? "?", 간단한 대답은 "아니오"입니다. 긴 대답은 "예,하지만 나중에 작동하지 않습니다"입니다. 이는 "아니오"라고 말하는 또 다른 방법입니다. :)

+0

에게이 infos에 대한 감사를 표시하지 않으면 매우 흥미 롭습니다! –

1

T0 (T1은 ...) "수요일 수정"이라는 CouchDB를이다. 문서를 변경할 때마다 개정 번호가 증가합니다. 문서의 이전 버전은 더 이상 이전 버전을 원하지 않을 때까지 저장되며 데이터베이스에 "compact"라고 알려줍니다. http://wiki.apache.org/couchdb/HTTP_Document_API에서

+0

+1 ... * 매우 흥미 롭습니다. 나는 나의 질문을 조금 더 편집했다 : 기본적으로 나는 (특정 리비전이 지정 될 때) 쿼리가 참조 적으로 투명하게 될 수 있는지 알고 싶다. –

3

두 번째 질문에 대한 답변 : 예에서 "이전 수정 버전 액세스"를 참조하십시오.

변경된 데이터는 항상 더 높은 버전 번호와 함께 트리에 추가됩니다. 같은 회전판은 절대로 바뀌지 않습니다. 귀하의 정보를

:

개정 (1-ABCDEF)이 그 방법을 구축 IST

: 1 = (여기서는 첫 번째 버전) 버전의 수, 두 번째는 문서 내용에 해시 (하지가 확실하다, 거기에 더 많은 "소금"이 있다면) ... 동일한 변경 내용 (1-, 2-, 3-)을 사용하는 경우 동일한 문서 내용으로 인해 동일한 개정 번호 (couchdb의 동일한 설정으로)가 다른 시스템에서도 항상 생성됩니다.

다른 방법입니다 :

보기 "byRev":

for (var curRev in doc.versions) { 
    map([doc.doc_id,doc.versions[curRev].v],doc.versions[curRev]); 
} 
0,123,516

{ 
id:"docHistoryContainer_5374", 
"doc_id":"5374", 
"versions":[ 
    {"v":1, 
    "date":[2012,03,15], 
    "doc":{ .... doc_content v1....} 
    }, 
    {"v":2, 
    "date":[2012,03,16], 
    "doc":{ .... doc_content v2....} 
    } 
] 
} 

은 다음 수정을 요청할 수 있습니다 : 당신이 이전 버전을 유지해야하는 경우, 당신은 더 큰 문서 내부 문서를 저장할 수 있습니다

호 :

/byRev startkey = "5374"] & endkey = "5374"{}]

결과 :

{ID "docHistoryContainer_5374"키 = 5374,1] value = {... doc_content v1 ....}} {id : "docHistoryContainer_5374", key = [5374,2] value = {... doc_content v2 ....}

추가로 이제 키의 날짜와 일치하는지도 기능을 작성할 수 있으므로 날짜 범위의 수정 요청

+0

이런,하지만 그건 완전히 거대합니다!따라서 컴팩트하지 않고 현재 날짜와 동등한 날짜 범위에서 쿼리를 수행하는 동안에는 쿼리가보다 명확하게 투명하게 보장됩니다. (적어도 특정 DB의 개념에서) 나는 생각하는 놀라운 기능입니다! "상태를 다시 만들"(예 : 추적/디버깅) 때 훨씬 쉽게 할 수 있습니다. 그리고 간단히, 전반적으로 프로그램에 대한 추론이 훨씬 쉬워졌습니다. CouchDB에 관심이 많습니다 **) ** 답변에 +1 : –

+0

죄송합니다 ... 날짜 쿼리는 두 번째 버전에만 있습니다 ... 이전 버전의 컨텐츠를 찾는지도를 작성할 수 없습니다. 특정 문서에 대해 해당 문서를 "요청"한 다음이 개정판의 내용을 검색 할 수는 있지만 – okurow

4

이미 말했듯이, 기술적으로 가능하기 때문에 그다지 믿지 마십시오. 압축에 관한 것뿐만 아니라 CouchDB의 가장 큰 강점 중 하나 인 복제에 관한 것입니다. 그러나 네가 압축을 풀지 않고 복제하지 않으면 항상 모든 문서의 모든 이전 버전을 가져올 수 있습니다. 나는 쿼리로는 작동하지 않을 것이라고 생각하지만, 이전 버전에서는 작동하지 않는다.

기본적으로 CouchDB의 디자인에서 가장 큰 실수는 "mvcc_token"또는 이와 비슷한 것입니다. MVCC 만 구현하기 때문에 버전 관리에 사용되지 않습니다.

관련 문제