Database/SQL

[Mysql] enum vs tinyint, boolean 차이점

JaeHoney 2021. 11. 24. 21:52

MySQL enum?

ERD 설계, 엔터티 설계, DTO 설계를 할 때 고민되는 부분이 있습니다.

 

enum vs boolean, enum vs tinyint

어떤 차이가 있을까요?

 

비교

ERD를 많이 보신 분들이라면, enum('Y', 'N')을 사용하는 경우를 종종 볼 수 있습니다.

상태(State) 또는 코드(Code)에서도 enum("CANCEL", "STOP", "COMPLETE")등을 사용하기도 합니다.

 

하지만, 이는 그리 좋은 방법이 아닐 수 있습니다.

 

왜 Why?

  • Enum은 DB 비표준이자, MySQL의 확장입니다. 여기서 문제가 발생할 수 있습니다.
  • 다른 종류의 DBMS로 마이그레이션이 불가능합니다.
  • 지정된 문자열이 아닌 다른 문자열이 들어왔을 때 빈 문자열이 저장될 수 있습니다.
  • 값이 변경될 때(시스템, 상황, 환경 등이 변경) 매우 복잡합니다.
    • 즉, 유연함을 잃고 좋지 않은 설계가 유지됩니다.

 

마무리

enum('Y', 'N')을 사용할 때는 tinyint(1), boolean이 바람직합니다.

 

여러개의 상태를 저장할 때는 큰 이점이 딱 하나 있어요! 바로 가독성입니다. 알아보기 쉽다는 점이 있습니다.

단점들도 작지 않기 때문에, stackoverflow 등의 사이트에서 언급하면 대부분 부정적인 답변이 돌아옵니다.

 

enum대신 사용할 수 있는 방법으로는 tinyint(4)를 사용해서 컬럼에 comment를 달고, API문서에 정의해서 내려주는 방법이 있습니다. (ex. 상태 - 1:취소, 2:정지, 3:진행, 4:완료)

 

가장 좋은 방법은 Code Table을 만들어서 관리하는 것입니다. 정규화 관점으로 볼 때도 가장 바람직한 방법입니다..

 

 

 

관련글