먼저 당신은 당신의 테이블에 속성 세트를 추가해야합니다
- 버전 - 마지막 수정 시간을 (대신 시간 카운터를 autoincrementing 될 수 있습니다).
- LastModifiedBy - 마지막 수정을 한 사용자에 대한 참조 (저장 한 경우).
그런 다음 버전 기록을 저장하는 방법에 대한 몇 가지 옵션이 있습니다. 당신은 할 수있다
히스토리를 저장할 각각의 메인 테이블에 대해 새로운 테이블을 만든다. 히스토리 테이블은 주 테이블과 동일한 필드를 갖지만 기본 키와 외래 키는 시행되지 않습니다. 각 외래 키에 대해서도 버전을 만들 때 참조 된 항목의 버전을 저장하십시오.
또는 엔티티에 관한 모든 흥미로운 내용을 직렬화하고 버전을 지정하려는 모든 엔티티에 대한 모든 직렬화 된 모양을 하나의 전역 기록 테이블에 저장할 수 있습니다 (개인적으로는 첫 번째 방법을 선호합니다).
히스토리 테이블을 어떻게 채우십니까? 업데이트 및 삭제 트리거를 통해.
- 엔티티의 업데이트 트리거에서 - 모든 이전 값을 기록 테이블에 복사하십시오. 각 외래 키에 대해서도 참조 된 엔터티의 현재 버전을 복사하십시오.
- 삭제 트리거에서 - 기본적으로 동일하게 수행합니다.
점점 더 많은 현대 시스템이 실제로 아무것도 삭제하지 않는다는 것에 유의하십시오. 그들은 단지 표시 삭제 된 것과 같습니다. 이 패턴을 따르고 싶다면 엔티티에 IsDeleted 플래그를 추가하는 대신 여러 가지 이점이 있습니다. 물론 삭제 된 엔티티를 모든 곳에서 필터링해야합니다.
기록을 어떻게 봅니까? 메인 테이블과 동일한 속성을 가지고 있기 때문에 히스토리 테이블 만 사용하면된다. 하지만 - 외래 키를 확장 할 때 - 참조 된 엔터티 버전이 내역 테이블에 저장하는 것과 동일한 지 확인하십시오. 그렇지 않은 경우 - 해당 참조 된 엔터티의 기록 테이블로 이동하여 값을 가져와야합니다. 이 방법을 사용하면 모든 참조를 포함하여 엔티티가 그 순간에 어떻게 보였는지 항상 파악할 수 있습니다.
위의 모든 것 외에도 이전 버전으로 엔티티의 상태를 복원 할 수도 있습니다.
스냅을 저장하기 때문에이 구현은 쉽지만 약간의 공간을 소비 할 수 있습니다. 변경 사항을 저장하려는 경우 - 업데이트 트리거에서 어떤 필드가 변경되었는지 감지하고 일련 화 한 후 글로벌 기록 테이블에 저장할 수 있습니다. 그렇게하면 사용자 인터페이스에서 변경된 내용과 누구에게 표시 할 수 있습니다 (이전 버전으로 되 돌리는 데 문제가있을 수 있음).
출처
2016-05-27 09:59:54
Evk
나는 더 상세한 대답을 얻기 위해 현상금을 추가 할 것이다 :) –
@AnynameDonotcare는 히스토리를 저장할 각 테이블에 대해 다음을 수행한다. 1) 버전 열을 추가한다 (카운터가 증가 할 수있다). 2) 기본 테이블과 동일한 모든 등록 정보를 가진 다른 테이블을 추가하십시오 (그러나 외래 키를 더 잘 확장하십시오). 3) 업데이트 전 트리거에서 버전 열이 변경된 경우 - 이전 버전 값을이 버전 테이블에 복사합니다. 4) 이익. – Evk
@Evk : 간단한 예제 ('EF'사용)로 상세한 답변을 추가 할 수 있다면 매우 기쁠 것입니다. (삭제 작업 및 mm 관계와 관련하여) 기업용 애플리케이션의 기반으로 사용될 수 있습니다. –