source

MySQL ENUM 유형 vs 조인 테이블

nicesource 2022. 11. 4. 21:30
반응형

MySQL ENUM 유형 vs 조인 테이블

나의 요구 사항

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

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


초기 설계

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

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

앱에서 정수와 문자열 설명의 매핑을 유지하고 싶지 않기 때문에 별도의 상태 설명 테이블(FK 관계에 따라)에 배치할 예정입니다.

그 후 MySQL의 ENUM 유형이 요구 사항에 정확히 부합한다는 것을 알게 되었습니다.MySQL에 직접 의존하는 것 외에 ENUM 타입을 사용할 때 함정이 있습니까?

  • ENUM에서 값 집합을 변경하려면ALTER TABLE이로 인해 테이블 재구축이 발생할 수 있습니다.대단히 비용이 많이 드는 작업입니다(EUNM 정의 끝에 새로운 값을 하나만 추가하면 테이블 재구축은 이루어지지 않습니다만, 1개를 삭제하거나 순서를 변경하면 테이블 재구축이 이루어집니다).반면 룩업 테이블의 값 집합을 변경하는 것은 INSERT 또는 DELETE처럼 간단합니다.

  • 어떤 Atribut이 폐기되고 어떤 Atribut이 사용자 인터페이스의 드롭다운목록에 포함될 수 있는지 등 다른 Atribut을 ENUM 값에 연관지을 수 있는 방법은 없습니다.그러나 룩업 테이블에는 이러한 속성에 대한 추가 열이 포함될 수 있습니다.

  • ENUM을 쿼리하여 개별 값 목록을 가져오기는 매우 어렵습니다. 기본적으로 데이터 유형 정의를 쿼리해야 합니다.INFORMATION_SCHEMABLOB에서 목록을 구문 분석하여 반환했습니다.시도해 보세요.SELECT DISTINCT status현재 사용 중인 상태 값만 가져옵니다. 이 값은 ENUM의 모든 값이 아닐 수 있습니다.그러나 룩업 테이블에 값을 보관하면 쿼리, 정렬 등이 쉬워집니다.

아시다시피 저는 ENUM을 별로 좋아하지 않습니다. :-)

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

업데이트: MySQL 8.0.16에서 CHECK 제약사항이 구현되었습니다.

enum의 속도 비교에 관한 기사입니다.힌트를 줄 수도 있어요.IMHO는 향후 99%의 확률로 변경되지 않는 문자열('예/아니오', '자녀/어른')의 고정 목록에서 사용하는 것으로 제한해야 합니다.

MySQL의 Enum은 이미 설명한 이유로 잘못되었습니다.
다음 사실을 추가할 수 있습니다.Enum은 서버 측에서 어떤 종류의 검증도 보장하지 않습니다.열거 정의에 존재하지 않는 값이 있는 행을 삽입하면 nice가 됩니다.<empty>또는NULL값을 DB에 저장합니다(enum 필드 선언의 NULL 가능 여부에 따라 다름).

내가 말하고자 하는 건 작은 것들이다.

  • enums 값은 65535로 제한됩니다.
  • 256 이상의 값이 필요하지 않은 경우 각 행에 대해 차지하는 공간이 줄어들고 그 동작은 훨씬 더 "불가능"합니다.

DB에 많은 데이터가 있고(RAM이 있는 경우), ENUM 값이 변경되지 않는 경우 조인 대신 ENUM을 사용합니다.더 빨라야 해요.
예를 들어 Join 케이스에서는 외부 키의 인덱스와 다른 테이블의 프라이머리 키의 인덱스가 필요합니다.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

반응형