2009-03-12 3 views
8

현재 저는 단일 버전의 여러 버전을 저장할 수있는 간단한 개정 시스템을 개발 중입니다.MySQL을 사용하여 간단한 수정 시스템을 만드는 가장 좋은 방법은 무엇입니까?

file_id  file_revision  file_parent  file_name 
-------------------------------------------------------- 
1   1     0    foo.jpg 
2   2     1    foorevised.jpg     
3   3     1    anotherrevision.jpg 

: (간략화를 위해 제거되지 않는 열) 다음

테이블 구조는

  • file_id 기본 키, 자동 증가
  • file_revision 점포 인을 수정 번호, 기본값은 1
  • file_parent 첫 번째 경우 0의 기본값 인 수정본의 최상위 상위 항목입니다.
  • file_name이 파일 이름입니다.

문제 :

  • 바람직 나는 모든 파일을 검색하려면 단일 쿼리를 사용하여 ...
  • 그러나 각 파일의 최신 버전 ...
  • .. 하나의 리비전 만 저장되면 (원본),이 리비전을 불러 와야합니다.

모든 포인터가 크게 감사하겠습니다. 미리 감사드립니다.

+0

이것이 왜 downvoted 였는지 나는 알지 못합니다. 합법적 인 질문이라고 생각합니다. 답을보기에 호기심이 생깁니다. –

답변

3

검색을위한 가장 효율적인 방법은 파일 1의 최신 버전을 가져올 때 select * from table where file_id=1 and is_latest=true을 미리 입력해야하는 is_latest와 같은 열을 추가하는 것입니다. 분명히이 테이블을 더 많이 업데이트 할 것입니다. 그러나 복잡합니다.

또 다른 방법은 파일의 최신 버전을 한 테이블에 저장하고 이전 버전을 다른 테이블에 저장하는 것입니다. 주로 파일을 최신 버전으로 선택하려는 경우 is_latest가 인덱싱 되더라도 select * from table where is_latest=true은 전체 테이블 스캔에 해당 할 수 있습니다. 최신 행이 모두 하나의 테이블에있는 경우 데이터베이스는 순차 IO로 모두 읽을 수 있으며 1) 필요한 레코드 만 찾기 위해 테이블을 통해 많은 작업 수행 또는 2) 큰 테이블 삭제 이전 레코드를위한 길을 따라 데이터의 양.

기존 테이블 디자인을 변경하지 않으려는 경우, 그룹 별 최대 값 선택을 호출하고 싶습니다. mysql에서 여러 가지 방법으로 this article을 참조하십시오.

+0

저는 이것이 아주 오래된 답변이라는 것을 알고 있습니다. 그러나 확실히 타임 스탬프 확인은 더 간단하고 쉽고 효율적입니다. is_latest 플래그를 제거하기 위해 마지막 리비전을 업데이트 할 필요가 없으며 선택시 1을 선택하고 타임 스탬프별로 순서를 지정합니다. – Sk446

1
file_id  file_revised  file_name    Time_Stamp 
----------------------------------------------------------------- 
1   1     foo.jpg     insert_time 
2   1     foorevised.jpg   insert_time     
3   1     anotherrevision.jpg  insert_time 

나는 다음과 같은 쿼리에 변화 할 것 :

SELECT * WHERE file_revision

또는 이러한 유형의 쿼리에 변화의 숫자, 즉 BY TIME_STAMP GROUP BY file_revision = 1 ORDER 제한 1 또는 file_id에 의해 Order로 가장 높은 것 또한 가장 최신이 될 것입니다.