본문 바로가기
서비스 기획/바닥부터 이커머스 시스템 기획

13. 주문 취소 데이터 설계

2021. 1. 19.

1단계: 주문 취소 데이터 나열하기

주문 취소는 크게 입금전과 배송전으로 나뉜다. 입금전에는 전체 주문취소만 가능하고 입금(결제)이후 배송전(상품 준비, 배송 준비)에는 상품마다 부분 취소가 가능하다. 배송이 시작되면 주문을 취소할 수 없고 상품마다 개별 반품을 신청하게 된다.

육육걸즈의 입금전 주문 취소. 전체 주문 취소만 가능하다.


2단계: 주문 취소 테이블 구성하기

첫 번째 이슈는 주문 취소내역을 따로 저장하는 테이블의 필요 여부였다. 한 건의 주문에 여러 건의 주문 취소가 발생한다취소 내역을 주문 테이블과 별도의 테이블로 분리해야 할 것이다.

여러 건의 주문 취소가 발생할 수 있는 경우는 두 가지인데 하나는 부분 취소 케이스이고 다른 하나는 주문-주문취소-주문취소 철회 케이스이다. 부분 취소는 품목별 주문번호가 있기 때문에 사실상 각각 별도의 주문이라고 볼 수 있다.

후자가 고민했던 케이스인데 아래 입금전 취소 처리 매뉴얼에서 발견했다.

출처: 카페24 관리자매뉴얼

위 매뉴얼에서 명시한대로 입금전 처리를 할 수 있다는 것은 주문취소를 철회할 수 있다는 의미이다. 입금전 상태로 복구한다고 하였으니 주문취소 철회는 새로운 주문번호를 따는 것이 아니라 기존의 주문번호로 회귀하는 것으로 추측된다.

여기서 정의해야 하는 정책은 입금전 상태로 복구되면 한 번 더 주문 취소가 가능한지이다. 그래야 이 주문취소 철회 케이스에서 한 건의 주문에 여러 건의 주문 취소가 발생할 수 있는지 판별할 수 있다. 결론적으로 시스템 상에서는 가능하다.

이어지는 두 번째 이슈는 그렇다면 취소번호를 기본키로 지정해도 되는지이다. 입금전 취소는 관리자의 취소 처리 없이 주문이 자동 취소된다. 입금전 구매자 취소와 시스템 취소가 있는데 이 경우는 각각 구매자가 취소 신청하고 입금기간이 만료되는 시점에 취소번호가 생성된다고 볼 수 있다. 입금전 판매자 취소는 당연히 관리자가 처리하므로 취소 '신청'의 개념이 없다. (취소번호 기본키 지정 문제 없음)

문제는 입금후 취소인데 아래 입금후 취소 처리 매뉴얼로 추측해보자면 취소 신청만 하면 취소번호가 생성되지 않는다. 관리자가 취소처리 시 비로소 취소번호가 생성된다.

출처: 카페24 관리자매뉴얼

여기까지 주어진 정보로 내가 확신할 수 없는 것은 취소 철회 시에도 취소번호가 생성되는지이다. 취소번호가 생성되지 않는다면 아래 표처럼 취소번호를 취소 내역 테이블의 기본키로 지정할 수 없다.

결론적으로 내가 생각한 방법은 별도의 기본키를 지정하거나 (취소 철회 시 취소번호가 생성되지 않는다면)

처리여부와 상관없이 취소 신청 건마다 취소번호(기본키)를 생성하는 것이다.

신청 이후에 어떻게든 CS 상태에 변화가 있기 때문에 두 번째 방법이 더 적절한 것 같은데 (입금후 취소 신청만 하고 아무일도 일어나지 않는 경우는 없으므로) 이게 또 구분하자면 취소 신청 로그와 실제 취소 내역 테이블로 구분할 수도 있을 것 같다.


3단계: 테이블간 관계 설정하기

주문 테이블과의 관계를 살펴보면 다음과 같다. 다시보니 주문과 결제 테이블 관계가 일대다 관계로 잘못 설정되어 있었다. 당시에 데이터 생성 시점이 달라서 테이블을 나누겠다고 생각했었는데 주문과 결제는 일대일 관계이고(주문 한 건에 결제 한 번) 일대일 관계의 테이블을 분리하겠다면 다음 내용을 염두해두어야 한다.

[참고] 일대일 관계가 사용되는 경우
1) 필드 수의 제한으로 테이블을 여러 테이블로 나누어야 할 때 
2) 성능 때문에 테이블을 여러 테이블로 나누어야 할 때 
3) 보안 상의 이유로 테이블의 일부를 별도로 저장할 때 
4) 기본 테이블의 부분 집합에만 적용되는 정보를 저장하는 경우 사용합니다.

데이터베이스의 성능이 떨어지는 경우에 큰 테이블을 작은 테이블로 나누어서 관리하는 것이 효율적일 수도 있습니다. 그러나 일대일 관계의 많은 테이블로 분리하는 것은 효율적이지 못할 수 있습니다. 큰 테이블로 운영할 때 성능이 떨어진다고 판단이 되면 그때 쪼개십시오. 테이블에 넣을 필드가 255개의 필드를 넘어서는 경우는 별 수 없이 2개의 테이블로 분리해야 합니다.

출처: 7강. 관계에 대하여 #1 - 김규경님의 데이터베이스 기초 다지기

마치며
예상치도 못한 주문취소 철회 때문에 삽질을 했다. 사실 구매자 입장에서는 주문-주문취소까지만 접하기 때문에 가볍게 생각했었는데 관리자 입장에서는 주문취소를 철회하는 상황도 있을 수 있다. 입금전에 품절이 나서 주문을 일괄 취소시켰는데 재입고 되어서 주문을 복구시킨다든지(이 경우는 사실 입금전이기 때문에 주문을 새로 받는게 구매자에게나 판매자에게나 더 일반적이다. 입금전 부분취소가 안되는 것도 비슷한 이치다), 입금후에 구매자가 취소 신청하였으나 이미 배송이 시작되어 취소를 거부(철회)한다든지 등의 경우가 있다. 취소 들어서자마자 넘나 고난이다...

참고자료

 

namjunemy/TIL

:pencil:Today I Learned / 기억은 기록을 이길 수 없다. Contribute to namjunemy/TIL development by creating an account on GitHub.

github.com

 

컬럼수가 많은 테이블의 1:1 분리를 통한 성능 향상

8.8 컬럼수가 많은 테이블의 1:1 분리를 통한 성능 향상때로는 한 테이블에 300개 이상의 컬럼이 있는 경우가 있다. 이렇게 많은 컬럼은 로우 체이닝..

www.gurubee.net

 

댓글