your programing

MySQL ENUM 유형과 조인 테이블

lovepro 2020. 12. 29. 08:07
반응형

MySQL ENUM 유형과 조인 테이블


내 요구 사항

테이블은 상태을 유지해야합니다 .

이 열은 5 개 상태 중 하나를 나타냅니다.


초기 디자인

나는 그것을 정수 열로 만들고 숫자 값을 사용하여 상태를 나타낼 수 있다고 생각했습니다.

  • 0 = 시작
  • 1 = 실행 중
  • 2 = 충돌
  • 3 = 일시 중지
  • 4 = 중지됨

내 앱이 정수에서 문자열 설명으로의 매핑을 유지하는 것을 원하지 않기 때문에 별도의 상태 설명 테이블에 배치 할 계획입니다 (FK 관계에 의존).

그런 다음 MySQL에 내 요구 사항과 정확히 일치하는 ENUM 유형이 있음을 발견했습니다. MySQL에 대한 직접적인 종속성 외에 ENUM 유형을 사용할 때 함정이 있습니까?


  • ENUM에서 값 집합을 변경하려면 ALTER TABLE테이블 재구성을 유발할 수있는이 필요합니다. 이는 엄청나게 비용이 많이 드는 작업입니다 (단순히 ENUM 정의 끝에 하나의 새 값을 추가하는 경우 테이블 재구성이 발생하지 않지만 하나를 삭제하는 경우) 또는 순서를 변경하면 테이블 재구성이 수행됩니다.) 조회 테이블에서 값 세트를 변경하는 것은 INSERT 또는 DELETE만큼 간단합니다.

  • 폐기 된 속성, 사용자 인터페이스의 드롭 다운 목록에 넣을 수있는 속성 등 다른 속성을 ENUM의 값과 연관시킬 수있는 방법은 없습니다. 그러나 조회 테이블에는 이러한 속성에 대한 추가 열이 포함될 수 있습니다.

  • 고유 값 목록을 얻기 위해 ENUM을 쿼리하는 것은 매우 어렵습니다. 기본적으로에서 데이터 유형 정의를 쿼리하고 INFORMATION_SCHEMA반환 된 BLOB에서 목록을 구문 분석해야합니다. SELECT DISTINCT status테이블에서 시도 할 수 있지만 현재 사용중인 상태 값만 가져 오며 ENUM의 모든 값이 아닐 수도 있습니다. 그러나 조회 테이블에 값을 유지하면 쿼리, 정렬 등이 쉽습니다.

아시다시피 저는 ENUM의 팬이 아닙니다. :-)

열을 고정 된 값 집합과 단순히 비교하는 CHECK 제약 조건에도 동일하게 적용됩니다. 어쨌든 MySQL은 CHECK 제약 조건을 지원하지 않습니다.

업데이트 : MySQL 8.0.16은 이제 CHECK 제약 조건을 구현 합니다 .


enum의 속도 비교에 대한 기사 입니다. 힌트를 줄 수도 있습니다. IMHO는 고정 된 문자열 목록 ( "예 / 아니오", "어린이 / 성인")에서 사용하는 것으로 제한되어야하며 99 % 확률로 미래에 변경되지 않습니다.


mysql의 열거 형은 이미 설명 된 이유로 나쁘다.
다음 사실을 추가 할 수 있습니다. Enum은 서버 측에서 어떤 종류의 유효성 검사도 보장하지 않습니다. 열거 형 정의에서 끝나지 않는 값이있는 행을 삽입하면 열거 형 필드 선언의 NULL 가능 여부에 따라 DB에서 nice 또는 NULL 값을 얻을 수 있습니다.

tinyint에 대한 내 요점 :
-열거 형은 65535 값으로 제한됩니다.
256 개 이상의 값이 필요하지 않으면 tinyint는 각 행에 대해 더 적은 공간을 차지하고 그 동작은 훨씬 더 "예측 가능"합니다.


DB에 많은 데이터가 있고 (데이터가 더 많으면 RAM이 있음) ENUM 값이 절대로 변경되지 않으면 조인 대신 ENUM을 사용합니다. 더 빨라야합니다.
조인의 경우 외래 키에 대한 인덱스와 다른 테이블의 기본 키에 대한 인덱스가 필요합니다. Riho가 말했듯이 벤치 마크를 참조하십시오.


테이블은 국제화하기가 더 쉬울 것입니다. 그러나 데이터베이스 외부의 클래스도 마찬가지입니다. 이러한 종류의 검사는 비즈니스 로직에 있지 않을 때 디버깅하기 어려울 수 있으며 일반적으로 데이터베이스 사용자의 책임이 아닙니다.

최적화로서 아마 매우 시기상조 일 것입니다. 그러나 OP는 어쨌든 편의 기능으로 주로 제안합니다.

http://komlenic.com/244/8-reasons-why-mysqls-enum-data-type-is-evil/ 참조

참조 URL : https://stackoverflow.com/questions/362044/mysql-enum-type-vs-join-tables

반응형