문제

엔티티의 모든 버전을 쉽게 인덱스 된 방식으로 저장해야하며 누구나 어떤 시스템을 사용할 시스템에 대한 정보가 있는지 궁금해했습니다.

버전을 작성하지 않으면 시스템은 단순히 사람과 같이 행이있는 관계형 데이터베이스입니다. 사람의 상태가 변경되면 해당 행이 변경되도록 변경됩니다. 버전을 사용하면 항목이 항상 이전 버전으로 돌아갈 수 있도록 이러한 방식으로 업데이트되어야합니다. 시간적 데이터베이스를 사용할 수 있다면 이것은 무료 일 것이며 '어제 2시에 더블린에 살고 30 세의 나이에 모든 사람들의 상태가 무엇인지 물어볼 수 있습니다. 불행히도 일시적으로 수행 할 수있는 성숙한 오픈 소스 프로젝트가없는 것 같습니다.

이 작업을 수행하는 정말 불쾌한 방법은 상태 변경 당 새 행을 삽입하는 것입니다. 사람은 많은 분야를 가질 수 있지만 업데이트 당 하나의 변경 만 할 수 있으므로 복제로 이어집니다. 그런 다음 타임 스탬프가 주어진 모든 사람의 올바른 버전을 선택하는 것은 매우 느립니다.

이론적으로는 관계형 데이터베이스와 버전 제어 시스템을 사용하여 시간 데이터베이스를 모방 할 수 있지만 꽤 끔찍하게 들립니다.

그래서 나는 누군가가 이전에 비슷한 것을 발견 한 것과 그들이 어떻게 접근했는지 궁금합니다.

업데이트Aaron이 제안한 바와 같이 여기에 우리가 현재 사용하고있는 쿼리 (MySQL)입니다. > 200k 행으로 테이블에서 확실히 느립니다. (ID = 테이블 키, person_id = 1 인당 ID, 그 사람이 많은 수정 사항이있는 경우 복제)

person p에서 이름을 선택하십시오.

업데이트이 작업을 수행하는 가장 좋은 방법은 시간적 DB를 사용하는 것이지만 오픈 소스가 없다는 점을 감안할 때 다음으로 가장 좋은 방법은 업데이트 당 새 행을 저장하는 것입니다. 유일한 문제는 변경되지 않은 열의 복제와 느린 쿼리입니다.

도움이 되었습니까?

해결책

이것을 다루는 두 가지 방법이 있습니다. 둘 다 항상 새 행을 삽입한다고 가정합니다. 모든 경우 타임 스탬프를 삽입해야합니다 (created) 행이 "수정"되었을 때 알려줍니다.

첫 번째 접근법은 숫자를 사용하여 이미 보유하고있는 인스턴스 수를 계산합니다. 기본 키는 객체 키와 버전 번호입니다. 이 접근법의 문제는 당신이 필요로하는 것 같습니다. select max(version) 수정을 위해. 실제로, 이것은 앱의 모든 업데이트에 대해 먼저 사람의 현재 버전을로드하고, 수정하고 버전을 증가시킨 다음 새 행을 삽입해야하므로 이것은 거의 문제가되지 않습니다. 따라서 실제 문제는이 디자인이 데이터베이스에서 업데이트를 실행하기가 어렵다는 것입니다 (예 : 많은 사용자에게 속성을 할당).

다음 접근법은 데이터베이스에서 링크를 사용합니다. 복합 키 대신 각 객체에 새로운 키를 제공하고 replacedBy 다음 버전의 키가 포함 된 필드. 이 접근법은 현재 버전을 찾기가 간단하게 만듭니다 (... where replacedBy is NULL). 그러나 새 행을 삽입하고 기존 행을 업데이트해야하므로 업데이트는 문제입니다.

이것을 해결하려면 백 포인터를 추가 할 수 있습니다 (previousVersion). 이렇게하면 새 행을 삽입 한 다음 백 포인터를 사용하여 이전 버전을 업데이트 할 수 있습니다.

다른 팁

다음은 시간 데이터베이스에 관한 문헌에 대한 (다소 날짜) 설문 조사입니다. http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.91.6988&rep=rep1&type=pdf

나는 그 언급 및/또는 Google 학술 검색 데이터 모델에 맞는 몇 가지 좋은 기술을 찾으려고 노력하십시오. 행운을 빕니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top