MySQL은 CHECK
제약 조건을 적용하지 않습니다. CHECK
제약 조건의 구문이 허용되며 문서로 메타 데이터에 유지됩니다. 그러나 MySQL은이를 강제하지 않습니다. 물론 BEFORE INSERT 및 BEFORE UPDATE 트리거를 모두 사용하여 이러한 유형의 제약 조건을 적용하기 위해 트리거를 사용할 수 있습니다.
그러나 하나의 값만 선택하면 훨씬 좋은 옵션이 될 수 있습니다 ENUM
데이터 유형의 단일 열. ENUM
데이터 유형을 사용하면 미리 정의 된 값 목록 중에서 하나만 값을 할당 할 수 있습니다. 그리고 MySQL은이를 시행합니다.
는 ("엄격한"의 SQL 모드가 활성화되어 있지 않은 경우, MySQL은 약간 느슨한이며, 유효하지 않은 값이 예외를 throw하는 대신 할당 될 때, MySQL은 대신에 조용히은 "값이 없음"자리를 대체합니다.)
ENUM은 별도로 저장된 부울 열에 비해 행에서 상당한 공간을 절약하게됩니다 (단 하나의 문자 또는 TINYINT 여부와 상관없이 부울 유형의 저장소를 구현할 계획입니다).
성능에 대해서도 질문했습니다.
ENUM
열을 사용하면 "부울"열을 개별적으로 저장하는 것보다 성능이 좋아집니다. 짧은 행, 적은 수의 NULL 표시기, 블록 당 더 많은 행, 여러 열 대신 하나의 열에 대한 색인 열, 자동 실행 "ONLY 하나"대 저장된 프로그램 (트리거) 호출의 오버 헤드.
지금까지 당신이 그렇지 않으면 일반적으로 문자열 값을 검색하기 위해이 조회 테이블에 조인 수행 될 경우, ENUM
데이터 유형을 사용하여, 특히, 룩업 테이블에 외래 키 대 완벽하게 수용 디자인으로 화면 또는 보고서에 표시 할 수 있습니다.
주의 사항 : "엔티티"테이블을 제거하지 않는 한 "조회"테이블을 제거하는 것이 좋습니다. "엔티티"테이블에서 "개인, 장소, 사물, 개념 또는 이벤트를 나타내는 행을 고유하게 식별 할 수 있고 비즈니스에 중요한 행을 포함하는 테이블을 의미합니다."
예를 들어 '열림', '닫힘', '보류 중', '취소됨', '지연됨'등을 포함하는 '상태'열ENUM,
에 대한 완벽한 후보자입니다. 고객, 주문, 배송, 지불 등 우리가 진정으로 관심을 가지는 실제 "엔터티"와는 달리 개별적으로 식별 가능한 "엔터티"가 아니기 때문입니다.
FOLLOW-UP
열거에 유효한 값의 목록을 얻기위한 편리한 메커니즘이 없다; 내 경험상 대부분의 개발자는 정상적인 패턴에 따라 "조회"쿼리를 실행할 수있는 테이블을 선호합니다.
"조회"테이블에 추가하는 것은 하나의 항목이 드롭 다운 목록에 표시되어야하는 순서를 지정하는 seq
(시퀀스) 열입니다 (때로는 요구 사항이 순서대로 나열되기 때문에 알파벳순이 아니며 저장된 문자열 값에서 쉽게 파생되지 않습니다.)
조회 테이블의 외래 키 대신 ENUM
데이터 유형을 성공적으로 구현했습니다. 이 모델은 약간 깔끔한 데이터 모델을 제공하고 (다이어그램에 흩어져있는 불필요한 관계 선을 피함) 응용 프로그램의 성능을 향상시킵니다. 이는 해당 조회 테이블에 대한 조인을 피하기 때문입니다. 클라이언트 측에서는 select/insert/update 측면에서 VARCHAR 열과 똑같이 작동합니다.
자세한 내용을 담고있는 다른 테이블에 연결된'CommEventPurposeType' 컬럼을'boolean' 타입으로 대체하려고합니까? 저에게는 2 가지 이상의 타입이있을 수 있습니다. 왜 부울 타입으로 대체할까요? –