#title 이력관리 [[TableOfContents]] ==== 모델링시 이력관리를 마지막에 해야 하는 이유 ==== 데이터 모델링시 이력관리를 마지막에 해야 하는 이유는 뭘까? 그것은 __이력관리의 대상 자체가 개체간의 관계 또는 개체의 속성의 변경에 대한 것__이기 때문이다. 속성 및 관계가 모두 정의되기 전까지는 이력관리가 약간 무의미하다. 데이터 모델링이라는 업무를 정의하는 과정의 도구이기 때문에 정의되지 않은 것을 대상으로 정의한다는 자체가 논리적으로 맞지 않다. 그러므로 이력관리에 대한 작업은 데이터 모델링 과정 중 마지막에 하라는 것이다. (많은 책에서 이유를 밝혀주지 않아 필자 나름대로의 생각하고 경험한 이유임을 참고하라.) ==== 이력관리 예제 ==== 독자들 나름대로 아래의 그림에서 이력관리의 대상이 되는 것을 찾아보라. 중요한 것은 이력관리가 되기 전까지는 모든 개체, 속성 및 관계의 정의는 '현재'라는 시간적인 의미를 가진다는 것이다. attachment:history_mng.jpg 필자의 눈에는 이력관리의 예상이 되는 것이 6개가 보인다. '''속성 변경이력(개체상태 변경이력)''' * 연봉이력 * 직급이력 * 부서명 이력 '''관계 변경이력''' * 발령이력 * 관리자변경이력 * 조직변경이력 '''개체 변경이력''' * 사원수 변경이력 * 조직 변경이력 대부분의 현업은 머리속에는 이러한 변경 관리에 대한 내용을 알고 있다. 하지만 잠재 의식 속에 있는 것이라 밖으로 표출되지 않으므로 모델러가 밖으로 끄집어 내야 한다. 모델러의 눈에 보이거나 변경관리의 가능성이 있는 속성 및 관계들을 하나씩 집어 가면서 이력관리가 필요한지 물어봐야 한다. 다음은 이력 관리에 대한 내용을 포함한 ERD다. 여기에서는 '관리자 변경이력'은 필요 없다고 현업이 정의했다고 가정한다. 또한 '직급이력'은 변경시점(변경이벤트)만 관리하고, 나머지 이력은 '시작일 ~ 종료일'형태의 기간으로 관리한다고 가정했다. (즉, 점으로 관리할지 선분으로 관리할지는 깊이 생각 안한 모델이란 거지..) '개체수 변경이력'은 집계 or 통계 or DW쯤에 해당되는데, 이 문서에서는 이 부분을 뺐다. attachment:history_mng02.jpg ==== 주의사항 ==== 기간으로 이력을 관리할 경우 '시작일', '종료일'과 같이 2개의 속성이 도출되는데, 이력을 관리할 경우는 '시작일 ~ 종료일'을 하나의 속성으로 간주해야 한다. 또한 이력을 관리한다고 할 경우 관계의 카디널리티가 변경되므로 이를 주의해야 한다. 위 ERD의 경우 '사원'과 '부서'간의 1:다 관계가 이력을 관리한다고 하는 순간 다:다의 관계로 변경되는 것을 볼 수 있다. 2개의 컬럼을 하나의 속성으로 간주했을 때는 물리적인 구현(인덱스 생성)시 고민해야 할 부분이 있다. 이 부분은 다음의 문서를 참고하라. * [시작 ~ 종료 형태에서의 인덱스 정렬 순서에 따른 성능 영향 요소] ==== 사건, 상태 ==== * 사건: 점으로 표현 * 상태: 선분(기간)으로 표현 ==== 이력의 유형 정리 ==== * 속성 변경이력 * 관계 변경이력 * 개체 변경이력 * Count * Sum * Min * Max * Avg ==== 참고자료 ==== * attachment:이력관리/이력관리.pdf {{{ --20021014을 기준으로 상태 변경 이전 ;with 부품상태변경이력(부품번호,상태코드,유효시작일,유효종료일,발생순번) as ( select 'cdr788', 'a', '20021012', '99991231', 5 union all select 'lcd257', 'a', '20021010', '20021012', 1 union all select 'lcd257', 'c', '20021010', '20021012', 1 union all select 'lcd257', 'e', '20021010', '20021012', 2 union all select 'lcd257', 'f', '20021010', '20021014', 3 union all select 'lcd257', 'z', '20021014', '99991231', 1 ) select * from 부품상태변경이력 where 유효시작일 < '20021014' and 유효종료일 >= '20021014' and 부품번호 = 'lcd257' --20021014을 기준으로 상태 변경 이후 ;with 부품상태변경이력(부품번호,상태코드,유효시작일,유효종료일,발생순번) as ( select 'cdr788', 'a', '20021012', '99991231', 5 union all select 'lcd257', 'a', '20021010', '20021012', 1 union all select 'lcd257', 'c', '20021010', '20021012', 1 union all select 'lcd257', 'e', '20021010', '20021012', 2 union all select 'lcd257', 'f', '20021010', '20021014', 3 union all select 'lcd257', 'z', '20021014', '99991231', 1 ) select * from 부품상태변경이력 where 유효시작일 <= '20021014' and 유효종료일 > '20021014' and 부품번호 = 'lcd257' }}}