테이블의 레코드 수준 버전 관리를 위해이 post을 사용하고있었습니다. 나는 아키텍쳐가 히스토리 테이블의 사용을 다룬다는 것을 알아 차렸다. 그러나 내 시나리오에서는 롤백이 필요하지 않지만 시간 기록에서 시점을 검색합니다. 이것은 버전 관리를 위해 하나의 테이블을 사용하는 디자인으로 시도한 곳입니다. 이것은 베어 본 테이블 데이터 (제약 조건, 인덱스 등 없음)입니다. id를 기반으로 인덱스를 작성하려고하는데, 이는 컬럼에 group by 절을 포함하기 때문입니다.기록 테이블이없는 데이터베이스 버전 관리
예를 들어, I는
ID는 식별자 테이블 테스트,
modstamp이 외에도 (null는) 데이터
의 소인이다 가지고 위의 열에는 부기 열이 포함됩니다.
local_modstamp는 레코드
del_modstamp 업데이트되었을 때의 imestamp는 local_modstamp = NULL 레코드의 값을 가질 것 인 기록 백업 중에
가 모든 레코드가 소스로부터 얻어진 삽입 삭제되는 시간 소인 del_stamp = null입니다.
삽입 : 레코드가 얻어지면
id |modstamp |local_modstamp |del_modstamp | ---|---------------------------|---------------|-------------| 1 |2016-08-01 15:35:32 +00:00 | | | 2 |2016-07-29 13:39:45 +00:00 | | | 3 |2016-07-21 10:15:09 +00:00 | | |
이러한 데이터를 처리하기위한 시나리오 (기준 시간 [ref_time] 가정 프로세스가 실행되는 시간)이다 정상적으로.
업데이트 : 가장 최근 레코드를 local_modstamp = ref_time으로 업데이트하십시오. 그런 다음 새 레코드를 삽입하십시오. 쿼리는 다음과 같습니다 갱신 테스트 세트 local_modstamp = ID = 및 local_modstamp가 null는 아니고, del_modstamp이
삭제 테스트 값 (...)에 널 (null) 삽입되지이다 : del_modstamp와 가장 최근의 기록을 갱신 = ref_time. 업데이트 테스트 = 경우 ID를 del_modstamp 설정 = 및 local_modstamp는 null가 아니고, del_modstamp이
디자인은 local_modstamp가 null는 아니고, del_modstamp가 null가 아닌 최신 기록을 얻는 것을 목적으로 널 (null)이 아닙니다.
select id, max(modstamp) from test where modstamp <= <ref_time> and (del_modstamp is null || del_modstamp <= <ref_time>) group by id;
내가 null를 사용하는 실수 (? 내가 가진)을 만든 것 같다 : 그러나, 나는 쿼리를 사용하여 시간에 지점을 검색하려는 문제 (가장 안쪽 쿼리)에 달렸다 테이블의 최신 레코드를 식별하는 자리 표시 자입니다. 기존 설계를 사용하여 시점 기록을 얻는 방법이 있습니까?
그렇지 않으면 가능한 해결책은 local_modstamp를 최신 레코드로 설정하는 것입니다. 이것은 업데이트의 경우 max (local_modstamp)를 사용하여 로직을 업데이트해야합니다. 특정 시점 데이터를 가져 오기 위해 기존 아키텍처를 유지할 수 있습니까?
현재 SQL Server를 사용하고 있지만이 디자인은 다른 데이터베이스 제품에도 적용될 수 있습니다. 벤더 특정 hacks을 사용하는 대신 데이터를 검색하는 좀 더 일반적인 방법을 사용하려고합니다.
삭제를 수행하면 최신 버전이 1로 표시 되나요? 아니면 삽입되고 1로 삭제 표시됩니까? 이것은 쿼리의'및 v.IsDeleted = 0;'쿼리에 영향을줍니다. 예를 들어 Sally는 2016-10-01에 회사를 남겨 둡니다.하지만 2016-06-01에있는 상태를 쿼리해야하며, 목적을 달성하는 절에서 isDeleted를 무시할 것입니까? 나는 표를 정상화할지의 수수께끼에 처해있다. 나는 스키마에서 수천 정도를 백업하고 테이블을 두 개로 정규화해도 테이블은 부 풀릴 수 없다. 동일한 테이블에서이 작업을 이식 할 수 있습니까? – dmachop
정적 데이터가없고 모든 열이 버전 테이블에 버전 관리되는 경우 위의 해결 방법은 단일 테이블로 수행 할 수 있습니다. 특정 시점 또는 최신 데이터를 선택할 때마다 임시 테이블 (버전에서 고유 한 ID 선택)을 생성 한 다음 필요에 따라 조인을 수행해야합니다. – dmachop
PK는 정적이며 경험상 다른 정적 속성은 거의 없음을 보여줍니다. 그러나 마스터 테이블에 PK 만있는 경우에도 여전히 두 개의 테이블이 필요합니다. 다른 테이블의 FK 대상이 되려면 버전없는 마스터 테이블이 필요합니다. 다른 버전 관리 체계를 읽었을 때 극도로 극복 할 수없는 문제는 항상 참조 무결성의 부족이었습니다. 이 (vnf)는이 문제를 해결합니다. – TommCatt