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을 만들어서 관리하는 것입니다. 정규화 관점으로 볼 때도 가장 바람직한 방법입니다..
관련글
'Database > SQL' 카테고리의 다른 글
MySQL - 인덱스 타는지 체크 방법 (+개선 방법, 인덱스를 타게 하는 방법) (0) | 2022.01.01 |
---|---|
데이터베이스 - 순서(정렬) 컬럼 두는 전략 비교 (2) | 2021.12.04 |
Boolean 컬럼 이름 짓기 (Flag naming convention) (0) | 2021.11.24 |
MySQL - 파티션(Partition), 테이블 분할 (0) | 2020.12.31 |
MySQL - 전체 텍스트 인덱스 (0) | 2020.12.31 |