주문 배송 시스템에 대해 데이터베이스 설계부터 성능 개선까지를 목표로하는 프로젝트를 시작했다.
요구사항에 맞춰 기능명세서를 작성하고 필요한 테이블들을 구성했다.
도메인은 고객, 상품, 주문, 배송으로 나눠져 있으며 기능이 많아 DB의 크기가 생각보다 크게 설계되었다.
내가 맡은 배송부분의 기능 중에 배송 우선순위를 정하는 프로세스가 가장 난감했는데, 이 프로젝트는 DB만으로 진행되는 프로젝트라서 우선순위를 정하기 위한 위치정보와 거리계산이 어려울 것 같았다.
고민끝에 두가지 방법을 생각해봤는데,
첫번째는 고객의 주소가 입력될 때 위도와 경도를 같이 입력하여 이를 활용한 거리계산을 하는것이다. 이 방법을 쓰면 정확한 거리계산을 통해 우선순위를 정할 수 있겠지만 상당히 복잡한 데이터들이 들어가야 하고 입력되는 주소에 대한 위도와 경도값을 구하는것도 까다로웠다.
두번째 방법은 배송이 완료될때마다 쌓인 데이터를 통해 통계로 예상시간을 계산하여 우선순위를 정하는 것이다. 이 방법을 이용할 경우 데이터가 적을때에는 비효율적으로 우선순위가 정해지겠지만 충분한 양의 데이터가 쌓인다면 예상시간을 통해 효율적인 경로를 찾을 수 있을것으로 생각했다.
두번째 방법을 통해 데이터를 활용하여 우선순위를 정하는게 첫번째 방법보다 프로젝트의 의도에 더 부합하는 것 같다는 생각에 두번째 방법으로 우선순위를 계산하기로 하였다.
이 방법도 쉽게 계산되지는 않고 배송 로그에 충분한 데이터가 쌓여있다는 전제하에 아래의 프로세스에 따라 진행된다.
1.배송 기사에게 할당된 주문들의 주소 중에 집하장소(물류 창고)에서 가장 시간이 적게 걸리는 곳을 우선순위 1번으로 둔 다음 배송 로그 테이블에 출발지(물류 창고)와 출발 시간을 기록한다.
2.배송이 완료될 경우 배송 로그 테이블에 도착지, 도착시간을 기록한다.
3.도착한 주소에서 다시 가장 시간이 적게 걸리는 곳을 2번으로 둔 다음 배송 로그에 출발지와 출발 시간을 기록한다.
4.반복
우선순위를 정하는 기능은 위와 같은 방법으로 설계하였고, 배송 로그 테이블에 데이터가 저장되는 기능은 MySQL의 트리거를 활용해 배송이 완료될 경우 자동으로 테이블에 기록이 될 것이다.
여기서 신경써야 할 부분은 배송 로그 테이블에서 정확한 주소들을 빠르게 찾을 수 있게 하는 것과
해당 주소들간의 출발시간과 도착시간의 차이를 구해 비교하는 것이라 생각된다.
전자는 풀텍스트 인덱스를 활용해보고 후자는 rank함수를 활용해볼 계획이다.
이제 충분한양의 더미데이터를 넣은 후 생각한 프로세스가 정상적으로 잘 기능을 하는지 확인해봐야 할 것이다.
'개발일지' 카테고리의 다른 글
MySQL 성능 개선 프로젝트 3 (0) | 2024.09.04 |
---|---|
MySQL 성능 개선 프로젝트 2 (0) | 2024.09.03 |
20240125 (0) | 2024.01.25 |
20240118 (0) | 2024.01.18 |
20240116 (0) | 2024.01.17 |