ENUM과 정수 유형의 장점과 단점은 무엇입니까?


110

임의의 테이블에서 status 라는 열이 있다고 가정 해 봅시다 . 실제 값은 enabled 또는 disabled 입니다.

이 열의 데이터 유형이 int / bool (1 또는 0)이거나 ENUM값이 enabledand 와 함께 사용 되는 것이 더 disabled좋습니까? 장점이나 단점은 무엇입니까?

두 가지 유효한 상태 대신 4 또는 10 이상이 있다고 가정 해 봅시다. 필요한 값의 수가 증가함에 따라 장점과 단점이 한쪽 또는 다른쪽으로 흔들리는가?


5
이 질문은 가슴 아픈 사람이나 승리의 근원이 될 수 있기 때문에 모든 MySQL 개발자가 북마크해야합니다. +1 !!!
RolandoMySQLDBA

답변:


70

ENUM을 사용하지 않아야하는 8 가지 이유에 대해 매우 기이하지만 유익한 기사를 찾았습니다 .

기사가 없어도 알아


1
이 글의 다른 답변은 매우 유익하지만 매우 유용한 기사로 인해이 답변을 답변으로 표시하고 있습니다.
Jake Wilson

6
+1 다른 테이블에서 ENUM 열의 멤버 목록을 재사용 할 수 없습니다. ENUM은 다른 DBMS 로의 이식성이 제한되어 있습니다.
11

필드에 동일한 테이블의 다른 레코드와 관계가있는 경우 어떻게해야합니까? 예를 들어, units각 레코드에 관련 단위에 대한 특성이 있어야하는 상점 항목의 모델을 가정하십시오 composition. 즉 Ton, Kg, gm
SaidbakR

그 기사에 대해 기괴한 것은 없습니다. 훌륭합니다! 나는 그들이 나쁜 이유에 나를 데려 간이 게시물이라고 생각합니다! 나는 그것을 +1했다!
Vérace

1
이 기사에서는 ENUM 유형 대신 오래된 테이블을 사용하는 것이 좋습니다. 이것을 대답에 추가해야합니까?
Utku

39

우선 스토리지 요구 사항이 있습니다. 나는 당신이 inint 대신 tinyint를 의미한다고 가정 할 것입니다.

  • ENUM은 1 바이트 (255 값 미만인 경우) 또는 2 바이트 (최대 65,535 개)
  • TinyInt는 1 바이트를 사용합니다 (최대 255 개 값)
  • 부울은 TinyInt의 동의어입니다

표면적으로는 모두 같습니다. ENUM은 관련 문자열 값에 대한 일부 메타 데이터를 사용합니다 ( 이전 src ).

그러나 더 많은 값을 추가하면 이점이 ~에서 멀어지기 시작합니다 ENUM. 특히 테이블이 이미 사용중인 후에 값을 추가하는 경우 수용하도록 테이블 구조를 변경해야하기 때문에.

ENUM? 를 사용하면 어떤 이점이 있습니까? 값의 의미에 대한 문자열 표현. 내가 아는 한 그게 다야. 그 가치는 응용 프로그램에 따라 다릅니다.


4
유일한 장점을 언급 한 +1 : 문자열 표현. 다른 모든 것들은 세차입니다.
RolandoMySQLDBA

19

ENUM은 코드 테이블의 짧은 형식 정의입니다. 주요 장점은 코드 설명을 결합하고 표시하는 데 필요한 코드를 피할 수 있다는 것입니다. 또한 문자열 형식으로 도착하면 값을 쉽게 설정할 수 있습니다.

다음과 같은 단점이 있습니다.

  • 코드에 대한 추가 메타 데이터 기능이 없습니다.
  • 값을 추가하거나 비활성화하기가 어렵습니다. (비활성화 코드는 트리거 및 만료 필드를 사용하여 수행 할 수 있습니다.)
  • 데이터베이스에서 I18n을 수행 할 수 없습니다.
  • 테이블 전체에서 재사용 할 수 없습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.