선분 이력 관리
데이터 아키텍처(DA) 및 데이터베이스 모델링에서 선분(기간) 이력 관리(Line Segment History Management)란, 특정 데이터의 상태가 ‘언제부터 언제까지 유효했는지’를 선분(Line Segment)의 형태인 ‘시작일시’와 ‘종료일시’를 두어 관리하는 기법입니다.
시간의 흐름에 따라 변경되는 데이터(예: 고객의 등급, 상품의 가격, 직원의 소속 부서 등)의 과거, 현재, 그리고 미래 상태를 명확하고 쉽게 조회하기 위해 주로 사용됩니다.
1. 핵심 개념
시간을 기하학의 ‘선분’에 비유한 것입니다.
- 시작점 (시작 일자/시간): 데이터의 특정 상태가 유효해지기 시작한 시점
- 종료점 (종료 일자/시간): 해당 상태의 유효성이 끝난 시점
- 현재 시점의 데이터: 아직 종료되지 않고 현재 유효한 데이터는 종료일시를 무한대(예:
9999-12-31)로 설정하여 표현하는 것이 일반적입니다.
2. 점(Point) 이력 vs 선분(Line Segment) 이력
선분 이력을 이해하려면 가장 흔히 비교되는 ‘점 이력’과 비교해 보는 것이 좋습니다.
| 구분 | 점(Point) 이력 | 선분(Line Segment) 이력 |
|---|---|---|
| 개념 | 이벤트가 발생한 특정 시점점(변경일시)만 기록 | 데이터가 유효한 기간(시작일시 ~ 종료일시)을 기록 |
| 특징 | 구조가 단순함 (INSERT만 발생) | 구조가 복잡함 (INSERT와 이전 데이터의 UPDATE 발생) |
| 조회(특정 시점) | 과거 특정 시점의 데이터를 찾기 어려움 (Sub-query나 MAX 함수 필요) | 과거 특정 시점의 데이터를 찾기 매우 쉬움 (BETWEEN 사용) |
| 예시 | 계좌 입출금 내역, 로그인 로그 | 상품 가격 변경 이력, 고객 성급 변경 이력 |
3. 선분 이력 데이터 예시
[고객 등급 이력 테이블]
| 고객ID | 등급 | 시작일자 | 종료일자 | 비고 |
|---|---|---|---|---|
| C001 | BRONZE | 2022-01-01 | 2022-12-31 | 과거 데이터 (종료됨) |
| C001 | SILVER | 2023-01-01 | 2023-08-15 | 과거 데이터 (종료됨) |
| C001 | GOLD | 2023-08-16 | 9999-12-31 | 현재 유효한 데이터 |
위 테이블에서 알 수 있는 것:
- 이 고객의 현재 등급은 GOLD입니다 (종료일자가 9999-12-31).
- “2023년 5월 5일” 시점의 고객 등급을 알고 싶다면 쿼리가 매우 간단해집니다.
조회 쿼리 예시:
SELECT 등급
FROM 고객등급이력
WHERE 고객ID = 'C001'
AND '2023-05-05' BETWEEN 시작일자 AND 종료일자;(결과: SILVER 반환)
만약 이를 ‘점 이력(변경일자만 존재)‘으로 설계했다면, 2023년 5월 5일 이전의 날짜 중 가장 큰(MAX) 날짜를 찾는 복잡한 서브쿼리를 작성해야 하며, 데이터가 많아질수록 성능이 급격히 저하됩니다.
4. 선분 이력 관리의 장단점
장점
- 조회 성능 우수 (특히 시점 조회): 특정 시점(Point in time)의 데이터를 조회할 때
BETWEEN연산자를 사용하여 빠르고 직관적으로 데이터를 추출할 수 있습니다. - 조인의 편리함: 두 개 이상의 선분 이력 테이블을 조인하여 특정 기간 동안의 교집합을 구할 때 훨씬 유리합니다.
- 비즈니스 로직 단순화: 개발자가 복잡한 MAX, 서브쿼리를 쓰지 않아도 되므로 SQL 가독성이 좋아지고 오류가 줄어듭니다.
단점
- DML(데이터 조작)의 복잡성: 새로운 데이터가 들어올 때 (1) 새로운 Row를
INSERT하면서, 동시에 (2) 바로 직전 데이터의 종료일자를 새 시작일자 직전(또는 동일)으로UPDATE해야 하는 두 번의 작업이 필요합니다. - 데이터 무결성 관리의 어려움: 애플리케이션 버그 등으로 인해 선분이 겹치거나(Overlap) 선분이 끊어지는(Gap) 현상이 발생하면 치명적인 데이터 정합성 오류가 발생합니다.
5. 데이터 아키텍처(DA) 설계 시 주의사항
- 무결성 보장 (Gap과 Overlap 방지):
- 선분 이력에서 가장 중요한 것은 이전 데이터의 ‘종료일’과 새로운 데이터의 ‘시작일’이 빈틈없이 이어져야 한다는 것입니다.
- 예: 이전 종료일이
2023-08-15라면 새 시작일은2023-08-16이 되도록 트랜잭션 처리를 철저히 해야 합니다.
- PK (Primary Key) 설계:
- 일반적으로
[식별자 + 시작일시]또는[식별자 + 종료일시]를 복합키(Composite Key) 구성하여 PK로 잡습니다. 최근에는[식별자 + 종료일시]를 PK로 많이 권장합니다. (현재 유효한 데이터를 찾을 때 종일일시가 9999-12-31인 것만 찾고, 인덱스를 활용하기 좋기 때문입니다.)
- 일반적으로
- 인덱스(Index) 전략:
BETWEEN검색이 잦으므로, 인덱스 컬럼의 순서(예:고객ID + 종료일자 + 시작일자) 배치가 쿼리 성능을 크게 좌우합니다.
요약하자면, 선분 이력 관리는 데이터 입력 시점의 수고스러움을 감수하는 대신, 데이터 조회(READ) 시점의 성능과 편의성을 극대화하기 위한 데이터 모델링 기법입니다. 이력이 자주 변경되지 않지만 “당시 시점의 데이터” 조회가 빈번한 업무(보험, 금융, 인사, 상품 단가 관리 등)에서 필수적으로 사용됩니다.