티스토리 뷰
프로젝트 중 데이터 전송 건에 대해 누락이 있었고, 이를 확인하는 과정 중에 이해가 안가는 부분이 있어 파트 선배에게 질문을 했다.
선임 개발자분이 누락건과 그 이유를 분석하기 위해서 이력 테이블을 뒤져보고 pk를 조건 걸어서 조회해봤을때 매칭되는 로우가 없는 것을 보고 이력 테이블에 데이터가 누락되어있어서 전송이 안되었다고 하셨다.
이력 테이블에 해당 날짜를 조건으로 걸어서 조회했을때 데이터가 존재하지 않은것을 보고 누락되었다고 판단한 배경이 궁금해져서 질문을 했고, 선분이력 이라는 데이터를 관리하는 개념을 알게 되었다.
점이력(시점이력)
- 데이터의 변경이 발생한 시점에 대해서만 관리
선분이력
- 시점마다 달라지는 데이터를 관리하기 위한 개념
- 데이터의 변경이 적용된 시작 시점부터 그 상태의 종료시점까지 관리
(점이력은 익숙한 개념이니 차치하고, 선분이력을 위주로 포스팅)
선분이력의 예시
1. 특정시점을 기준으로 회원 등급이 달라지는 경우
- 특정시점 예시
- 1/31 까지는 회원이 A 등급
- 2/1 부터는 회원 등급이 B로 바뀜
ID와 이름 정보를 가지고 있는 테이블(A 테이블이라고 하자)의 pk가 {ID, 이름}와 같고 아래와 같이 구성되어있다고 한다면,
ID | 회원이름 | 등급 |
123 | 오감귤 | A |
이에 대해 선분이력을 관리하기 위한 테이블은 아래와 같다.
ID | 데이터적용시작일자 | 데이터적용종료일자 | 회원이름 | 등급 |
123 | 20230101 | 20230131 | 오감귤 | A |
123 | 20230201 | 99991231 | 오감귤 | B |
A 테이블과 A에 대한 이력 테이블의 차이는
- A테이블의 PK 조합에 대해서 이력 테이블에는 중복 로우가 발생함
👉 이력 테이블에서는 데이터적용시작일자까지 PK로 잡아서 데이터를 식별한다. - 20230131 날짜에 대해서 회원정보를 조회하려면 첫번째 행에 걸림, 20230201 날짜에 대해서 올바른 회원정보를 조회하려면 두번째 행(= 그 시점에 맞는 로우)으로 보내야함
👉시점에 맞는 데이터를 보내기위해 이력 테이블이 필요(= 선분이력)
2. 20230301부터 새로운 회원등급이 적용되는 경우
ID | 데이터적용시작일자 | 데이터적용종료일자 | 회원이름 | 등급 |
123 | 20230101 | 20230131 | 오감귤 | A |
123 | 20230201 | 오감귤 | B | |
123 | 20230301 | 99991231 | 오감귤 | BB |
- 프로그램(배치 등..)이 돌면서 새로운 행을 추가하고 기존 데이터적용종료일자를 수정한다
- 이때 기존(두번째 행)의 데이터적용종료일자는 프로그램이 돌면서 그 수행된 시점의 전일자로 업데이트된다.
- 새로운 행(세번째 행)은 배치가 수행된 시점의 새벽일자로 업데이트 된다
3. 이슈상황
3-1. 20230401에 새로운 등급이 추가되었으나, 데이터 적용종료일자가 변경되지 않는 경우
ID | 데이터적용시작일자 | 데이터적용종료일자 | 회원이름 | 등급 |
123 | 20230101 | 20230131 | 오감귤 | A |
123 | 20230201 | 20230228 | 오감귤 | B |
123 | 20230301 | 99991231 | 오감귤 | BB |
123 | 20230401 | 99991231 | 오감귤 | C |
- 20230402 날짜에 해당하는 회원등급을 조회하고자 할때 BB, C 두개의 로우가 조회됨
👉 선분이력을 잘못쌓으면 멀티로우가 생성된다. - 이력테이블을 조회할때에는 특정날짜(시점별로 구분하고자하는)에 대해 데이터적용시작일자와 종료일자를 BETWEEN 걸기 때문
WHERE 1 = 1
AND :date BETWEEN 데이터적용시작일자 AND 데이터적용종료일자
3-2. 특정 시점에 이력테이블에 로우가 없는 경우
ID | 데이터적용시작일자 | 데이터적용종료일자 | 회원이름 | 등급 |
123 | 20230101 | 20230131 | 오감귤 | A |
123 | 20230201 | 20230228 | 오감귤 | B |
123 | 20230302 | 99991231 | 오감귤 | BB |
- 20230301 시점에서 {ID : 123, 회원이름 : 오감귤} 대한 회원등급을 조회하지 못함
선분이력의 이점
- 과거 시점에 누락건에 대해서도 과거 특정 시점에 맞는 데이터를 나중에 보내줄 수 있음
- 2월달에 데이터를 못보냈는데 3월에 보내달라고 하면?(누락된지 한달뒤에) → 이력 테이블을 보고 이슈를 해결할 수도 있음
- 시점별로 달라지는 데이터의 경우 어떠한 시점에 맞는 데이터를 조회할 수 있다
- 이력관리를 통해 특정 시점에 맞는 데이터를 보내는데 활용될 수 있음
- 선분이력 테이블은 적용시작시점과 적용종료시점을 관리함으로써 과거 특정 시점의 데이터를 손쉽게 조회할 수 있음
- 특정 레코드의 상태 변경 이력을 쉽게 확인할 수 있음
참고한 곳
'데이터베이스' 카테고리의 다른 글
[MySQL] Multi Column Index(복합 인덱스) (0) | 2024.09.25 |
---|---|
[MySQL] Clusterd Index와 Non-clustered Index, B-Tree (1) | 2024.09.24 |
데드락(Deadlock, 교착상태)의 개념과 해결 방법 (0) | 2022.06.26 |
[Oracle] DUAL 테이블의 개념과 사용법 (0) | 2022.06.25 |
트랜잭션(Transaction)관리와 COMMIT과 ROLLBACK (0) | 2022.06.25 |
Comments