[TIL] 이력관리 & 선분이력

dev.soo·2020년 10월 25일
0

TIL

목록 보기
10/10

브랜디에서 모델링을 하면서 다음과 같은 상황에 맞딱뜨렸다.

  • Product 테이블 안에 '가격', '할인율', '할인시작일', '할인종료일' 이 들어가 있음
  • 테이블의 정보를 수정하게 되면 나중에 해당 상품이 언제 얼마였는지 알 수 없게 됨
  • 할인 관련 내용과 가격 관련 내용을 이력으로 남길 필요가 있음

이런 상황에서 처음 생각한 건,

  • '가격 이력' 테이블을 만들고, 가격이 바뀔 때 마다 바뀐 날짜와 바뀐 가격을 넣어줌
  • '할인 이력' 테이블을 만들고, 할인율/할인시작일/할인종료일 을 수정할 때 마다 이력을 작성해줌

그런데 이렇게 하면 과거 어떤 날의 가격을 알기 위해서 가격과 할인율을 동시에 확인해야 하는 번거로움이 있어 팀장님께 문의드렸더니, 두 테이블을 하나로 합치라고 하셨다.

두 테이블을 합쳤더니 아주아주 괴상한 테이블이 생겨났는데, 팀장님께서 '선분이력'을 적용하신거냐고 여쭤봐서 선분이력에 대해 찾아보았다.

이력 관리

많은 컬럼을 가지고 있는 '상품'이라는 테이블이 있다고 했을 때, 상품 테이블의 정보가 하나 바뀔 때 마다 그 순간 상품이 가진 모든 정보를 '스크린샷'을 찍듯이 저장해두면 가격과 할인 뿐 아니라 상품이름, 상품설명 등등 모든 정보를 잘 저장할 수 있다.

우리는 실제 서비스를 하는 게 아니기 때문에 핵심 정보인 가격 & 할인정보만 저장하기로 하였다.

1. 점이력

정보가 수정될 때 아래의 두 정보만 저장해두고, 추후에 수정할 일이 없게 된다.

  • 스크린샷 찍힌 날짜
  • 스크린샷에 찍힌 내용
id | price | changed_at      
1  | 10000 | 2020.10.25         
2  | 15000 | 2020.10.27         

이처럼 생기는 날짜에 따라 그저 축적된다.

 

2. 선분이력

점이력과 달리 하나의 정보를 더 추가한다.

  • 스크린샷 찍힌 날짜
  • 스크린샷에 찍힌 내용
  • 해당 스크린샷이 언제까지 유효할 지 미래의 어느 날짜

예를 들어 오늘 부터 가격을 10000으로 팔기로 했으면,

  • 시작일 : 2020.10.25
  • 가격 : 10000
  • 종료일 : 9999.12.31

이렇게 저장해 주고, 또 다시 정보가 추가될 겅우 종료일을 새로 생긴 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 을 추가해주기로 해였다.

프로젝트의 로직 파악 및 계획 잡기에 일주일이 걸렸다. 다음주부터 이걸 모두 코드로 옮겨야 한다니 걱정이 앞서지만, 모든 기능을 다 구현한다는 생각을 버리고 최대한 할 수 있는데까지 해야겠다.

다음주도 무사히 그리고 뜨겁게 지나가길..

0개의 댓글