선분이력이란 무엇인가

2 minute read

선분이력 테이블은 시작 시점과 종료 시점을 관리함으로써 과거 특정 시점의 데이터 조회를 손쉽게 할 수 있습니다. 또한, 특정 레코드의 상태 변경 이력을 손쉽게 확인 할 수 있습니다.

기본 개념

일반적인 데이터(사용자 접속 로그, 매출 기록 등등)는 점 이력으로 이루어집니다. 즉, 데이터가 발생한 순간의 상태만 알 수 있습니다.

입수일 영업상태
가맹점 A 20190301 성업
가맹점 A 20190401 성업
가맹점 A 20190501 폐업
가맹점 A 20190601 폐업

위 데이터를 조작하여 점이 아닌 선으로 표현하는 것이 선분이력입니다.

유효시작일 유효종료일 영업 상태
가맹점A 20190301 20190501 성업
가맹점A 20190501 99991231 폐업

img

3월부터 5월까지 성업으로 표현하고, 5월에 폐업으로 상태를 변경하면서 해당 이력의 유효종료일을 갱신합니다. 이런 것을 이력을 꺾는다고 표현하기도 합니다. 꺾인 데이터는 더이상 유효하지 않게 되고, 새롭게 유효한 레코드가 20190501 로 시작하게 됩니다. 유효종료일이 없는(현재 유효한) 레코드의 유효종료일은 (일반적으로 약속된) 99991231로 표현합니다. NULL로 관리하면 성능이 오히려 낮아집니다.

장단점

관리 테이블의 크기를 줄일 수 있고, 과거 특정 시점의 조회가 용이하다는 장점이 있습니다. 하지만, 사용자가 선분이력에 익숙해야 한다는 큰 단점(데이터 달라는 사람한테 선분이력테이블 던져주면, 많이 낯설어할 수 있습니다.)과 더불어 데이터를 한번 처리해야한다는 번거로움이 존재합니다. 또한 이력 관리를 위한 추가적인 컬럼 공간(유효시작일, 유효종료일)이 필요합니다.

장단점이 뚜렷한 관리 방식이기 때문에, 장점이 극대화되는 경우에만 선분이력으로 관리하는 것이 좋습니다. 넓은 범위 혹은 특정 키의 과거 시점 데이터를 조회하는 경우가 많거나, 특정 키의 핵심 값 변경 이력을 조회하는 경우가 많은 경우로 볼 수 있습니다. 만약 밀리초 단위로 쌓이는 이용자의 서비스 사용 로그 전체를 선분이력으로 관리해야한다면 굉장히 많은 리소스가 필요할 것이고, 이런 경우에는 몽고DB 같은 저장소에 쌓아두고 필요한 경우에만 가져다 쓰는 것이 나을 수 있습니다.

또한, 선분이력으로 관리하는 테이블의 컬럼 수가 많은 경우, 모든 값의 변경 조건으로 선분이력을 꺾는 것은 굉장히 비효율적일 수 있습니다. 따라서 이력을 변경할만한 핵심 값을 조건으로 하는 것이 중요합니다. 무의미하게 이력이 꺾이면 무의미하게 관리하는 데이터 양만 늘어납니다.

추가사항, 주의사항

선분이력 테이블 관리에 유용한 몇가지 팁

Primary Key

데이터 키(예시의 가맹점 키)와 유효시작일을 PK로 설정하는 것을 추천합니다. 유효 종료일까지 PK로 설정할 경우, 중복 데이터가 발생할 수 있습니다.

선분이력 테이블 조회

간단한 쿼리 vs. 성능이 좋은 쿼리인데, 검색해보니 이슈가 조금 있는 것 같습니다. 추후 보강 해야겠습니다.

  • 20190501 시점의 데이터를 조회
    • WHERE 20190501 BETWEEN 유효시작일 AND 유효종료일
    • WHERE 유효시작일 <= 20190501 AND 유효종료일 > 20190501
  • 20190301 부터 20190501 까지의 이력을 조회
    • WHERE 유효시작일 >= 20190301 AND 유효종료일 <= 20190501
  • 가장 최근 시점의 유효한 데이터를 조회
    • WHERE 유효종료일 = 99991231

미 입수 데이터 처리

고유한 키를 가진 데이터가 미 입수된 경우, 두가지 방법으로 관리할 수 있습니다.

  1. 해당 데이터의 이력을 종료합니다.
  2. 해당 데이터의 이력을 종료하고, 입수상태를 변경하여 새로운 이력을 생성합니다.
입수일 영업상태
가맹점 A 20190301 성업
가맹점 A 20190401 성업
가맹점 A 데이터가 안들어옴  
가맹점 A 20190601 성업
가맹점 A 20190701 폐업

1번 방법. 미입수된 시점으로 조회할 경우, 해당 데이터는 조회가 되지 않습니다. 또한, 데이터의 최종 상태를 손쉽게 조회할 수 있는 유효종료일=99991231 조건을 쓸 수 없습니다.

유효시작일 유효종료일 영업 상태
가맹점 A 20190301 20190501 성업
가맹점 A 20190601 20190701 성업
가맹점 A 20190701 99991231 폐업

img

2번 방법. 미입수 상태를 위한 추가 컬럼이 필요합니다.

유효시작일 유효종료일 입수 상태 영업 상태
가맹점 A 20190301 20190501 1 성업
가맹점 A 20190501 20190601 0 - (혹은 이전 상태 유지)
가맹점 A 20190601 20190701 1 성업
가맹점 A 20190701 99991231 1 폐업

데이터 성격, 이용 상황에 맞게 선택하시면 됩니다.


공부하면서 작성한 내용이기 때문에 잘못된 부분이 있을 수 있습니다. 오류 지적 혹은 더 나은 방법을 공유해주시면 감사히 수정하도록 하겠습니다.

Tags:

Updated:

Leave a comment