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
'your programing' 카테고리의 다른 글
바로 가기로 Android Studio에서 오류 줄을 탐색하는 방법은 무엇입니까? (0) | 2020.12.29 |
---|---|
PHP-MySQL 또는 MySQLi에서 가장 빠른 것은 무엇입니까? (0) | 2020.12.29 |
index.html을 기본값으로 설정하지만 입력하면 index.php를 방문 할 수 있습니다. (0) | 2020.12.29 |
VS 2012에서 MVC4 프로젝트를 만들 때 NuGet 오류 (0) | 2020.12.29 |
jQuery UI 대화 상자-인스턴스 메서드에 의해 존재하는지 확인 (0) | 2020.12.29 |