2014-12-31 3 views
0

테이블DataModel이 나는 다음과 같은 한

  • 사람 (PID, 이름, 생년월일, AddressId) PID가있는 대용 키 (자동 증가)

  • 주소 (Address1, Line1, Line2, City, State) 주소 대리 키가됩니다. (자동 증가)

많은 트랜잭션 테이블에서 PersonID (PID)가 사용됩니다. 일정 기간 동안 사람의 주소가 바뀔 수 있으므로 데이터베이스에 레코드 버전을 저장해야하므로 시간 슬라이스에 따라 올바른 버전을 참조 할 수 있습니다. 어떻게 처리해야합니까?

나는 역사 예를 저장하기 위해 같은 테이블을 사용하여이

  • 같은 솔루션 무언가를 가지고 생각하고
  • 사람 (PID, 이름, 생년월일, AddressId)
  • 주소 (AddressId, 1 호선, 2 호선, 도시, 주, STARTDATE, 종료 날짜, LastUpdatedBy, LastUpdatedDate)

이의는의 초기 기록을 가정 해 봅시다 사람은 다음과 같이

이제
Person(100, X, Y, 110) 
Address(110, A, B, C, D, 2011-01-01, 9999-12-31, Y, 2011-01-01) 

주소는 내가

을 할 생각입니다 PID (100)에 대한 2012 변경되었습니다 주소가 PID (100)에 대한 2014 다시 변경하는 경우

Address(740, A, B, Q, D, 2012-06-01, 2014-06-01, Y, 2012-01-01) - INSERT 
Address(320, A, B, C, D, 2011-01-01, 2012-06-01, Y, 2011-01-01) - NO CHANGE 
Address(110, A, B, N, D, 2014-06-01, 9999-12-31, R, 2012-06-01) - UPDATE 

가 지금은 대리 키를 변경하지 않고 동일한 테이블에서 기록 데이터뿐만 아니라 현재 데이터를 조회 할 수 있습니다처럼

Address(320, A, B, C, D, 2011-01-01, 2012-06-01, Y, 2011-01-01) - INSERT 
Address(110, A, B, Q, D, 2012-06-01, 9999-12-31, Z, 2012-06-01) - UPDATE 

그것은 보일 것이다. 나는 역사적인 테이블을 참조 할 필요가 없으므로 논리와 테이블을 공격 할 필요가 없다.

이 접근 방식은 주소 코드가 고유하다고 가정 할 때 테이블에 고유 키 제약 조건을 적용 할 수 없습니다. 어떻게 처리할까요?

다른 접근 방식과 피드백을 제안하십시오.

Person_At_Address(PID,AddressId,StartDate,EndDate,LastUpdatedBy,LastUpdatedDate) 

그리고 항복 사람과 주소에서 해당 열을 제거 :

Person(PID, Name, Dob) 
Address(AddressId, Line1, Line2, City, State) 

을 사람이 주소를 변경 이제 때마다 내가 할 것이 무엇

+0

'AddressID'및 'StartDate'에 고유 키 적용 –

+0

검색어는 '임시 테이블'입니다. [일시적인 데이터베이스에 관한 Snodgrass의 정액 책] (http://www.cs.arizona.edu/~rts/publications.html)은 그의 웹 사이트에서 무료입니다. 주제가 생각보다 복잡합니다. –

답변

0

날짜를 포함하는 관계 테이블을 만드는 것입니다 Person_At_Address 테이블에 새 행을 삽입하기 만하면됩니다. 쿼리 할 때 현재 및 현재 데이터에 대해 필요한 모든 정보를 얻었습니다.NO-변경 행이 사건에 관해서는

, 당신은 그것을 꺼내 옵션의 번호를 가지고 : 현재없이 행이없는 경우

  • 당신은 시간에 주어진 체크 포인트에 행을 삽입하는 예약 된 작업을 할 수 있습니다 그 시간 조각을 위해. 그런 다음 쿼리를 선택하면 위의 결과가 정확하게 나타납니다.
  • 응용 프로그램에서 누락 된 행을 채워서 쿼리를 실행 한 후 이와 같은 디스플레이를 만들 수도 있습니다. 그것은 또한 매우 간단합니다.