2009-12-30 6 views
0

Ok 이것은 설명하기 까다로운 내용입니다.MySQL - 기본 키가 아닌 각 레코드에 대해 고유 한 키 제공

현재 페이지를 사용할 앱을 만들고 있습니다. 현재는 SEL을 사용하여 페이지 ID를 키로 사용하고 있습니다.

지금 내가 겪고있는 문제는 사용자가 페이지를 편집 할 수 있지만 이전 페이지 (기록, 변경 기록 또는 위키 페이지 기록과 같은 기록 유지)를 잃어 버리지 않기를 바라는 것입니다.

이렇게하면 pageID에서 새 필드가 필요하지만 pageID 역할을하지만 행이 추가 될 때마다 자동으로 증가하는 기본 키가 아니라는 생각이 들게됩니다.

Google 문서 도구는 DOCID를 가지고 :/문서 DOCID = 0Af_mFtumB56WZGM4d3Y3d2JfMTNjcDlkemRjeg

그런 식으로 내가 같은 문서의 ID로 여러 레코드를 가지고 있고, dataAdded 필드를 기준 기록 변경 로그를 표시 할 수 있습니다. 그리고 사용자가 그 DOCID를보고 싶을 때, 나는 가장 최근의 것을 당기기 만하면됩니다.

생각하십니까? 나는 올바른 방향으로 나를 지적하는 당신의 영리한 생각에 감사드립니다!

+0

또는 parentID를 사용해야합니까? 재귀? – AnApprentice

답변

0

각 문서는 정말 버전입니다 :

문서 - (DOC_ID)

개정 - (rev_id, DOC_ID, VERSION_NUM, 이름, 설명, 내용, author_id, 활성 TINYINT 기본 1)

rev_id :/view? id = 21981

select *에서 리비전 r, doc d 만 있으면 모든 컨텐츠를 열 수 있습니다. 여기서 r.rev_id =? r.doc_id = d.doc_id

+0

매우 흥미 롭습니다 ... 그렇다면 DB의 기본 키가 무엇입니까? – AnApprentice

+1

예, 나와 같은 것을 찾는 것처럼 들립니다. http://stackoverflow.com/questions/1933929/database-table-setup-for-revision-tracking-with-orm – Xeoncross

+0

rev_id가 pk입니다 – jspcal

0

변경 내역을 기록한 감사 테이블을 유지합니다. 이렇게하면 변경 내용을 롤백하거나 변경 내역을 볼 때 되돌릴 수 있습니다.

+0

위키 또는 다른 앱이이를 수행합니까? – AnApprentice

0

당신은 이런 식으로 모델 수 있습니다

  • 앱은 여러 페이지가 한 페이지는 일부 버전 정보 (예를 들어, 날짜, 편집 수), 그 페이지에 외래 키와 각 (여러 버전이 있습니다)
  • 페이지를보기 것은 가장 최신 버전 편집 저장
  • 를 보여준다는 새 버전 당신이 올바른 궤도에있어
2

을 만듭니다. 당신이 필요로하는 것은 이력이나 리비전 ID, 그리고 문서 ID입니다. 이력 ID는 기본 키이지만 쿼리 목적을 위해 문서 ID에 키가 있어야합니다.

기록 추적을 사용하면 애플리케이션에 약간의 복잡성이 추가됩니다. 문서의 기본보기가 현재 문서 버전 (즉, 주어진 문서 ID에 대한 최대 히스토리 ID)을 표시하는지주의해야합니다.

대용량 문서를 저장하는 경우 모든 편집은 기본적으로 문서의 다른 복사본을 데이터베이스에 추가하기 때문에 테이블이 빠르게 커집니다. 어떤 종류의 "diff"저장소를 구현하는 것을 고려해 볼 수 있습니다. 여기에는 전체 내용이 아닌 문서의 변경 내용 만 저장되거나 히스토리 검색을위한 별도의 테이블에 히스토리 편집 내용이 보관됩니다.

+0

DIFF 스토리지를 수행하는 간단한 방법은 무엇입니까? Revision_ID, Doc_ID를 더 잘 이해하고 싶습니다. 몇 가지 레코드 예제를 제공 할 수 있습니까?/테이블? – AnApprentice

1

UUID는() '6ccd780c - 바바 - 1026-9564-0040f4311e29'와 같은이 숫자는 몇 백만 년 동안 반복되지 않을 것이다, 무작위로 생성 된 128 비트 번호를 생성합니다.

// 대부분의 자릿수는 타임 스탬프와 기기 정보를 기반으로하므로 숫자가 반복 될 때 비슷한 숫자가 표시되지만 항상 고유합니다.

0

이것은 두 테이블에 대한 좋은 일처럼 들립니다. page_header 테이블과 page_content 테이블을 가질 수 있습니다. 헤더 테이블은 title, categorization (무엇이든)과 같은 정적 정보를 보유 할 것이고 컨텐츠 테이블은 실제 편집 가능한 컨텐츠를 보유 할 것입니다. 사용자가 페이지를 업데이트 할 때마다 새로운 page_content 레코드를 삽입하고 기존 레코드를 업데이트하십시오. 페이지를 표시 할 때 최신 page_content 레코드를 가져와야합니다. 이것은 기록을 유지하고 필요한 경우 롤백하는 간단한 방법입니다.

행운을 빈다.

+0

WIKI가 Wikipedia와 같은 방식으로 작업을 완료하는 방법입니까? – AnApprentice