TIL - 05/30 이력관리

Sung Jun Jin·2020년 5월 30일
0

이력관리란?

데이터는 현재의 프로세스만 처리하고 버리는 것이 아니라 생성, 수정 삭제이력 등의 오랜 기간의 과거의 이력을 가지고 있는 데이터를 유지보수할 수 있어야 한다. 예를 들자면 이사를 가서 주소지를 옮길 때마다 주민등록증 뒷면의 주소 변경란의 주소가 추가되는 것이 있다. 데이터의 종류에 따라 이력을 관리할 적절한 방법을 선택해줘야 한다. 이력 관리 대상에 따른 선정 기준은 다음과 같다

  • 변경 내역을 감시할 필요가 있는가?
  • 시간의 경과에 따라 데이터가 변할 수 있는가?
  • 시간의 경과에 따라 데이터의 관계가 변할 수 있는가?
  • 과거의 데이터를 조회할 필요가 있는가?
  • 과거의 데이터를 보관할 필요가 있는가?

이력 데이터의 종류

  • 발생 이력(Occurence History) : 어떤 데이터가 발생할 때마다 이력 정보를 남겨야만 한다면 그 데이터는 발생 이력이라고 볼 수 있다. 고객이 웹사이트를 접속할 때매다 그 접속 데이터를 남기는 것을 발생 이력이라고 한다.

  • 변경 이력(Modification History) : 데이터가 변경될 때마다 변경 전과 후의 차이를 확인해야 한다면 변경 이력을 남길 수 있다. 예를 들어, 고객이 주문을 하고서 주문 정보를 변경하였을때, 혹은 상품의 가격이 변동되었을 때, 이전 주문과 상품의 정보를 관리하기 위해서 변경된 새로운 주문 정보를 이력 정보로 남겨야 한다.

  • 진행 이력(Progress History) : 업무의 진행도에 따라 이력 정보로 남겨둬야 하는 경우가 있다. 예시로 주문 프로세스의 구성은 다음과 같다

    구매 신청 -> 입금 완료 -> 배송 준비 중 -> 배송 중 -> 배송 완료 or 주문 취소

    각 단계가 언제, 누구에 의해 처리되고, 현재 진행중인 단계는 무엇인지에 대한 정보가 필요한 경우가 있다. 이러한 경우에는 진행 이력을 활용한다.

이력 관리 형태

이력 관리의 형태에는 크게 2가지 종류가 있다, 시점 이력과 선분 이력이다.

시점 이력

데이터의 변경이 발생한 시점만을 관리한다. 다음과 같은 테이블이 있다. 특정 국가의 환율과, 환율 변동의 발생시각을 관리해주는 테이블이 일대다 관계로 구성되어 있다.

특정 통화의 환율이 변경되면 그 시점의 해당 통화은 환율과 발생 시각이 기록된 새로운 인스턴스 (record)가 환율 변동 이력 테이블에 생긴다. 이 레코드는 어느 시점에 얼마의 값으로 변경되었다 라는 정보를 관리하는 것이다.

특정 시점의 환율을 가져오는 쿼리를 다음과 같이 작성할 수 있다.

SELECT currency 
FROM currency_histories
WHERE timestamp = (SELECT MAX(timestamp)
                   FROM currency_histories
                   WHERE timestamp <= 특정 시점 AND currencies_id = 'KRW_ID')

위의 쿼리문에서 보면 알 수 있듯이, 특정 시점의 데이터를 조회하고자 할 경우에는 조회하고자 하는 시점의 데이터를 가져오는 서브쿼리를 작성해줘야 한다. 이것이 시점 이력 관리 방식의 단점이다.

선분 이력

데이터 변경의 시작 시점부터 그 상태의 종료 시점까지 관리한다. 환율이 변경되면 각 통화의 특정 기간 동안 변경된 환율을 관리하는 레코드가 테이블에 생긴다.

시점 이력 관리 방식에서 환율 변동 이력 테이블에 발생시각(timestamp) 필드가 있었다면, 선분 이력 관리 방식에서는 데이터가 유효한 시작 시점(start_time)과 유효성이 종료된 시점 (end_time) 필드가 들어간다.

선분 이력 관리 방식에서 특정 시점의 환율을 가져오는 쿼리를 다음과 같이 작성할 수 있다.

SELECT currency
FROM currency_histories
WHERE 특정 시간 between start_time and end_time 
AND currencies_id = 'KRW_ID'

선분 이력에서 유효종료일의 시점을 관리하는 방식

  • 유효종료일을 null로 관리하기 : 타당한 관리방식이지만 유효종료일의 인덱스를 사용하지 못하므로 수행속도가 저하된다는 단점이 있다
  • DATETIME의 최대치 부여 : 데이터가 변경이 안된 시점에서 항상 유효종료일은 계속 현재시점보다 뒤에 있어야 하므로 DATETIME의 최대치(9999/12/13)을 부여해주는 관리방식이다. 유효종료일을 최대치로 설정하면 최신 데이터를 유효종료일의 인덱스로 가져올 수 있다.
SELECT currency
FROM currency_histories
WHERE end_time = '9999/12/31'
profile
주니어 개발쟈🤦‍♂️

0개의 댓글