2011-08-06 4 views
4

내가 일하고있는 회사의 프로젝트/작업 추적기로 내부적으로 사용하기 위해 앱에 작품을 보유하고 있습니다. MongoDB atm에서 놀아 라. 나는 다음과 같은 의사 스키마를 염두에두고있다.Python + MongoDB 문서 버전 관리

task 
    _id 
    name 
    project 
    initial_notes 
    versions 
     number 
     versions 
      version_1 
       worker 
       status 
       date(if submitted) 
       review_notes(if rejected) 
       reply_on(if accepted/rejected) 
      (version_n)(if any) 

내가 가지고있는 문제는 작업을 버전 관리하는 것이다. 나는 가능한 많은 방법을 읽었지 만, 나는 그 모든 것을 이해하는 데 부족합니다. 나는 here을 좋아하는 무언가를 읽고 정말 방법 mongoid처럼 않습니다 더 나은 차라리 그것을 가장 최신 버전 만 보여 싶습니다이

task 
    _id 
    versions 
     number_of_versions: 3 
     current_version 
      version_no: 3 
      worker: bob 
      status: accepted 
     old_versions 
      version 
       version_no: 2 
       worker: bob 

같은이있을 것이다 그것의 versioning

생각입니다 특정 작업에 대한 세부 정보 페이지를 입력 할 때 특정 작업의 모든 버전을 표시하고 싶습니다. 이 구조가 작동할까요? 그렇다면 필요한 것을 얻기 위해 어떤 쿼리를 실행해야합니까?

미리 읽어 보시고 답해 주셔서 감사합니다. 상태 : 1 명 노동자 : 스미스 상태 : version_no 버전 을 거부

답변

4

예, 왜 안을 거부했다. 그 계획은 효과가있을 것입니다. 또한,이 같은 고려가 :

task 
    ... 
    versions = [  # MongoDB array 
     { version_id 
      worker 
      status 
      date(if submitted) 
      review_notes(if rejected) 
      reply_on(if accepted/rejected) 
     }, 
     { version_id : ... }, 
     ... 

가능한 버전 삽입 쿼리

tasks.update({ # a query to locate a particular task}, 
       { '$push' : { 'versions', { # new version } } }) 

참고,이 경우 버전 배열의 마지막 버전을 검색하는 것은하지 않음으로써, 프로그램에 의해 이루어집니다 몽고.

+0

그래서 전체 배열을 검색하고 루프를 통해 가장 최근의 것을 결정하고 표시 하시겠습니까? 다른 스키마보다 이점이 있습니까? 첫 번째 버전에서는 db.task.findOne ({}, name : 1, ..., versions.current_version : 1) 많은 수의 작업을 수행 할 수 있습니까? db가 그렇게 크지는 않을 것이라는 점을 감안할 때 액세스 시간에는 아무런 문제가 없습니다. 그러나이 패턴을 더 큰 규모 (다른 응용 프로그램)에 적용해야 할 경우 향후 참조를 요청하고 있습니다. – pocorschi

+0

모든 작업을 수행하려면 버전을 별도의 컬렉션에 보관해야합니다."sql-way"로 비슷하게 들릴지 모르지만 Mongo DB의 설명서에 권장됩니다. http://www.mongodb.org/display/DOCS/Schema+Design#SchemaDesign-UseCases –

+0

버전은 5-6 범위 여야합니다. 최고. 아직도 내가 길이나 제안을 따라 가야하는지 잘 모르겠다. 거기에 미묘한 차이가 있지만 그것이 긍정적인지 부정인지 나는 볼 수 없다. – pocorschi

3

또한이 같은 모델을 고려해 볼 수 있습니다 : 이것은 현재의 데이터 (명시 적으로 최신 버전을 추적 할 필요가 없습니다 최상위 수준에 항상 장점이있다

task 
    _id 
    ... 
    old_versions [ 
     { 
      retired_on 
      retired_by 
      ... 
     } 
    ] 

문서입니다 자신의 현재 버전), 현재 버전을 가져 와서 old_versions 필드를 제거하고 db의 old_versions 필드에 $push을 입력하여 쉽게 기록을 추적 할 수 있습니다. 당신이 네트워크 IO를 최소화하려는 것 같았다 때문에

, 이것은 또한 당신이 그들을 필요로하지 않을 때 쉽게 old_versions를로드하지 않도록 할 수 있습니다 :

> db.tasks.find({...}, {old_versions: 0}) 

또한 애호가 취득 및 이전 버전의 목록을 저장할 수 변경된 입력란 만 이를 위해서는 응용 프로그램 계층에보다 섬세한 코드가 필요하며 많은 수정 버전이 필요하지 않거나이 문서가 매우 많을 경우에는 필요하지 않을 수 있습니다.