브랜디에서 모델링을 하면서 다음과 같은 상황에 맞딱뜨렸다.
- Product 테이블 안에 '가격', '할인율', '할인시작일', '할인종료일' 이 들어가 있음
- 테이블의 정보를 수정하게 되면 나중에 해당 상품이 언제 얼마였는지 알 수 없게 됨
- 할인 관련 내용과 가격 관련 내용을 이력으로 남길 필요가 있음
이런 상황에서 처음 생각한 건,
- '가격 이력' 테이블을 만들고, 가격이 바뀔 때 마다 바뀐 날짜와 바뀐 가격을 넣어줌
- '할인 이력' 테이블을 만들고, 할인율/할인시작일/할인종료일 을 수정할 때 마다 이력을 작성해줌
그런데 이렇게 하면 과거 어떤 날의 가격을 알기 위해서 가격과 할인율을 동시에 확인해야 하는 번거로움이 있어 팀장님께 문의드렸더니, 두 테이블을 하나로 합치라고 하셨다.
두 테이블을 합쳤더니 아주아주 괴상한 테이블이 생겨났는데, 팀장님께서 '선분이력'을 적용하신거냐고 여쭤봐서 선분이력에 대해 찾아보았다.
많은 컬럼을 가지고 있는 '상품'이라는 테이블이 있다고 했을 때, 상품 테이블의 정보가 하나 바뀔 때 마다 그 순간 상품이 가진 모든 정보를 '스크린샷'을 찍듯이 저장해두면 가격과 할인 뿐 아니라 상품이름, 상품설명 등등 모든 정보를 잘 저장할 수 있다.
우리는 실제 서비스를 하는 게 아니기 때문에 핵심 정보인 가격 & 할인정보만 저장하기로 하였다.
정보가 수정될 때 아래의 두 정보만 저장해두고, 추후에 수정할 일이 없게 된다.
id | price | changed_at 1 | 10000 | 2020.10.25 2 | 15000 | 2020.10.27
이처럼 생기는 날짜에 따라 그저 축적된다.
점이력과 달리 하나의 정보를 더 추가한다.
예를 들어 오늘 부터 가격을 10000으로 팔기로 했으면,
이렇게 저장해 주고, 또 다시 정보가 추가될 겅우 종료일을 새로 생긴 row 의 시작일로 변경해 준다.
id | price | validate_from | validate_until 1 | 10000 | 2020.10.25 | 9999.12.31
위의 테이블에 새로운 수정내용이 10/27에 생겼다고 하면,
id | price | validate_from | validate_until 1 | 10000 | 2020.10.25 | 2020.10.27 2 | 15000 | 2020.10.27 | 9999.12.31
이렇게 1번 row 의 validate_until 이 변경되게 된다.
원래는 유저의 정보가 변한 내용, 상품 정보가 수정된 내용을 포함한 아주 많은 정보가 모두 저장되어야 하지만, 우리는 시간관계상 가장 중요한 가격/할인관련 내용만 넣어서 선분이력으로 관리해주기로 하였다.
대신 삭제가 비교적 쉬운 옵션정보는 삭제내역을 따로 관리하지 않고 soft delete Column 을 추가해주기로 해였다.
프로젝트의 로직 파악 및 계획 잡기에 일주일이 걸렸다. 다음주부터 이걸 모두 코드로 옮겨야 한다니 걱정이 앞서지만, 모든 기능을 다 구현한다는 생각을 버리고 최대한 할 수 있는데까지 해야겠다.
다음주도 무사히 그리고 뜨겁게 지나가길..