새소식

인기 검색어

개발일기

순서가 있는 상태면 varchar 말고 int를 쓰자

  • -

개요

사내에서는 enum을 관리할 때 대부분 숫자코드를 사용한다. 처음에는 생쿼리를 볼때 뭘 의미하는지 몰라서 불편했는데, 순서가 있는 경우 꽤 편하다는 걸 느꼈고, 어떤 점들에서 좋은지 내 생각들을 적어보았다. (틀릴 수 있음 + 의견 환영)

 

쿼리를 볼때 헷갈리진 않나요?

int로 관리할 때 이게 최대 단점인 것 같다. 쿼리만 봐서는 어떤 상태를 의미하는지 파악하기 어렵다.

 

그런데 한 편으로는 중요한 값들은 어차피 외우고 있기도 하고 (ex. order_item.processing_status=4 => 배송 완료) 애플리케이션에서 코드를 찾아보면 되니까 지금은 크게 불편한 점을 못느끼고 있다.

 

그리고 쿼리를 볼때 말고 칠때라면, 어차피 애플리케이션에서 어떤 값이 들어있는지 찾아봐야 한다. (ex. "배송완료"인지 "배송 완료"인지)

 

어떤 점에서 편한가요?

쿼리 날릴 때 "숫자"임을 활용할 수 있다. 예를 들어, 배송 완료 이후 주문 상품 정보를 모아 보고 싶다면 varchar 타입의 주문 상품의 경우 다음과 같은 쿼리를 날려야 할 것이다.

 

-- 쿼리1
SELECT * FROM order_item WHERE processing_status="배송완료";

-- 쿼리2
SELECT * FROM order_item WHERE processing_status="구매확정";

 

만약 구매확정 이후에 "리뷰완료" 상태가 추가된다고 하면, 기존 코드들에서 쿼리3 SELECT * WHERE order_item.processing_status="리뷰완료"를 추가해야 할 것이다.

 

만약 숫자로 관리한다면? 다음 쿼리 하나면 해결된다

 

SELECT * FROM order_item WHERE processing_status > 4;

 

enum이면 중간에 순서가 바뀔때 치명적이지 않나요?

 

이를 대비해서 값을 크게 잡고, 중간에 다른 순서가 들어간다면 값을 1씩 늘려 집어넣을 수 있다.

 

예를 들어 200은 "구매완료", 300은 "배송중"이라고 가정하자. 이때 구매완료와 배송중 사이에 "검수중" 상태가 들어가도록 만들고 싶다면 201 "검수중" 상태를 추가할 수 있다.

 

주의할 점

<=를 사용하면 어쨌든 range기 때문에 인덱스를 안 타고 풀스캔하는 경우가 있습니다. 이런 경우 IN으로 lookup으로 만들어 풀어 넣거나, 힌트를 주어 해결할 수 있어 주의해야 합니다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.