[database-design] 데이터베이스에서 레코드를 버전 관리하는 방법

데이터베이스에 레코드가 있고 관리자 및 일반 사용자 모두 업데이트를 수행 할 수 있다고 가정 해 봅시다.

누구든지이 테이블의 모든 변경 사항을 버전 제어하는 ​​방법에 대한 좋은 접근 방식 / 아키텍처를 제안하여 레코드를 이전 개정으로 롤백 할 수 있습니다.



답변

당신이 있다고 가정 해 봅시다 FOO관리자와 사용자가 업데이트 할 수 테이블이 합니다. 대부분의 경우 FOO 테이블에 대해 쿼리를 작성할 수 있습니다. 행복한 날들.

그런 다음 FOO_HISTORY테이블을 만듭니다 . 여기에는 FOO테이블 의 모든 열이 있습니다 . 기본 키는 FOO와 RevisionNumber 열을 더한 것과 같습니다. 에서 외래 키 FOO_HISTORYFOO있습니다. UserId 및 RevisionDate와 같이 개정과 관련된 열을 추가 할 수도 있습니다. 모든 *_HISTORY테이블에서 (즉, Oracle 시퀀스 또는 이와 동등한) 계속해서 수정 번호를 채 웁니다 . 1 초에 한 번만 변경되는 것에 의존하지 마십시오 (즉 RevisionDate기본 키에 넣지 마십시오 ).

이제 업데이트 할 때마다 업데이트 FOO를 수행하기 직전에 이전 값을FOO_HISTORY . 프로그래머가 실수로이 단계를 놓칠 수 없도록 설계의 일부 기본 수준에서이 작업을 수행합니다.

행을 삭제하려면 FOO몇 가지 선택 사항이 있습니다. 캐스케이드 및 모든 히스토리를 삭제하거나 삭제 된 것으로 플래그 FOO를 지정 하여 논리적 삭제를 수행하십시오 .

이 솔루션은 현재 값에 관심이 많고 때때로 이력에만 관심이있는 경우에 좋습니다. 항상 기록이 필요한 경우 효과적인 시작 및 종료 날짜를 입력하고 모든 레코드를 FOO자체적으로 보관할 수 있습니다. 그런 다음 모든 쿼리는 해당 날짜를 확인해야합니다.


답변

누군가가 질문 / 답변을 편집 할 때 StackOverflow 가하는 것처럼 데이터베이스 레코드의 내용을 버전 화하려고한다고 생각합니다. 개정 시작을 사용하는 일부 데이터베이스 모델을 살펴 보는 것이 좋습니다 .

가장 좋은 예는 Wikipedia 엔진 인 MediaWiki입니다. 여기 에서 데이터베이스 다이어그램 , 특히 개정 테이블을 비교하십시오. .

사용중인 기술에 따라 좋은 diff / merge 알고리즘을 찾아야합니다.

.NET 용인 경우이 질문을 확인하십시오 .


답변

BI 세계에서는 버전을 지정할 테이블에 startDate 및 endDate를 추가하여이 작업을 수행 할 수 있습니다. 첫 번째 레코드를 테이블에 삽입하면 startDate가 채워지지만 endDate는 널입니다. 두 번째 레코드를 삽입하면 첫 번째 레코드의 endDate도 두 번째 레코드의 startDate로 업데이트합니다.

현재 레코드를 보려면 endDate가 널인 레코드를 선택하십시오.

이를 유형 2 느리게 변화하는 차원 이라고도합니다 . TupleVersioning 도 참조하십시오


답변

SQL 2008로 업그레이드하십시오.

SQL 2008에서 SQL 변경 추적을 사용해보십시오. 타임 스탬프 및 삭제 표시 열 해킹 대신이 새로운 기능을 사용하여 데이터베이스의 데이터 변경 내용을 추적 할 수 있습니다.

MSDN SQL 2008 변경 내용 추적


답변

이 문제에 대한 좋은 해결책 중 하나는 임시 데이터베이스 를 사용하는 것 입니다. 많은 데이터베이스 공급 업체가이 기능을 기본 제공 또는 확장을 통해 제공합니다. PostgreSQL과 함께 임시 테이블 확장을 성공적으로 사용 했지만 다른 확장도 있습니다. 데이터베이스에서 레코드를 업데이트 할 때마다 데이터베이스는 해당 레코드의 이전 버전도 보유합니다.


답변

두 가지 옵션 :

  1. 히스토리 테이블 보유-원본이 업데이트 될 때마다 이전 데이터를이 히스토리 테이블에 삽입하십시오.
  2. 감사 테이블-수정 전과 후 값을 감사 테이블의 수정 된 열에 대해서만 업데이트 대상 및시기와 같은 기타 정보와 함께 저장합니다.

답변

SQL 트리거를 통해 SQL 테이블에 대한 감사를 수행 할 수 있습니다. 트리거에서 2 개의 특수 테이블 ( 삽입 및 삭제)에 액세스 할 수 있습니다. )에 . 이 테이블에는 테이블이 업데이트 될 때마다 삽입되거나 삭제 된 정확한 행이 포함됩니다. 트리거 SQL에서 이러한 수정 된 행을 가져 와서 감사 테이블에 삽입 할 수 있습니다. 이 접근 방식은 감사가 프로그래머에게 투명하다는 것을 의미합니다. 그들의 노력이나 구현 지식이 필요하지 않습니다.

이 접근 방식의 추가 이점은 데이터 액세스 DLL 또는 수동 SQL 쿼리를 통해 SQL 작업이 수행되었는지 여부에 관계없이 감사가 발생한다는 것입니다. 감사는 서버 자체에서 수행됩니다.