특정 시점의 유저정보가 필요하다면 어떻게 해야할까?
실재 서비스에서는 유저정보, 상품정보와 같은 중요한 정보에 대해서는 언제 고객에 내역을 요청할지 모르기 때문에 새로운 수정사항이 생길 때 마다 이전의 상태를 그대로 저장시키는 이력관리를 해준다.
유저정보를 예로 들어보면, 말그대로 특정 이력이 업데이트 되면 새로운 버전의 이력이 생성된 시간과 날짜를 생성해준다. 즉, 생성된 시점을 '점'으로서 관리한다.
장점 : 새로운 버전이 생성된 날짜만 관리하기 때문에 편리하다.
단점 : 특정시점의 내 프로필 이력을 보고싶다면, 데이터베이스의 프로필정보 전체를 하나하나 뒤져서 프로필 버전의 생성날짜를 비교해 내가 찾는 특정시점의 날짜와 비교해야하기 때문에 소모가 큰 작업이 된다.
선분이력은 버전이 새로생길 때 마다 그 버전의 시작점과 끝점을 기록해주어 모든 버전의 이력이 빈공간없는 선으로서 이어지게 된다.
유저프로필 정보를 예로들어보자.
20200326 08:28에 A 유저가 자신의 프로필정보 수정을 했다고 가정해보자. A유저정보의 프로필은 이 시점을 기준으로 수정이전의 버전(V1)과 수정 이 후의 버전(V2)으로 나뉘게 된다. 이전의 버전의 시작날짜는 유저정보의 생성날짜가 될 것이고, 이전의 버전의 끝 날짜는 새로운 버전의 생성날짜가 될 것이다.
그리고 새로운버전(V2)의 시작날짜는 20200326 08:28 현시간이 될것이고, 새로운버전의 끝 날짜는 20370327등의 터무니없이 긴 날짜로 설정된다.(이는 새로운 버전이 생성되기 전에 이전의 버전도 마찬가지이다.) 그리고 또다시 새로운 버전(V3)이 생성되면 V2의 끝 날짜가 V3의 생성날짜와 일치된다. 이처럼 이력의 시간선상에 빈틈이 없도록 만들어주는 것(무결성)이 핵심이다.
이렇게 이력관리를 하게되면 버전의 시작날짜와 끝날짜만 생성되기 때문에 실재로 이 유저가 서비스에 가입한 최초의 시점을 알수 없다. 따라서 유저가 회원가입 한 최초의 시점(created_at)을 고정된 값으로 넣어주고, 이 유저의 정보가 수정된 시점(= 새로운 버전의 시작시점)인 updated_at을 넣어서 유저의 정보를 관리하도록 한다.
선분이력의 경우 특정시점을 찾기 쉬운 효율성이 있지만, 이력에 대한 look-up수요가 없는 데이터의 경우 선분이력을 통한 관리는 지나칠 수 있기 때문에 데이터의 성격과 이력에 대한 수요를 확인하여 선분이력을 사용할지 점이력을 사용할지 결정 해 주도록 한다.