2012-12-21 2 views
1

, 나는 BOOLEAN이 CommEventPurpose속성으로 그들을, 사용자가 CommEventPurposeType에 지정할 수 있다는 가능한 모든 값을 구현하기로 결정하고, 을 것이다 궁극적으로 CommEventPurposeType 테이블과 그 FK를 CommEventPurpose으로 버립니다.참조 ("유형") 엔터티 FK를 해당 FK의 가능한 값의 전체 집합을 나타내는 BOOLEAN 특성으로 대체하는 것이 괜찮습니까? (역 정규화를) 조인 제거하여 물리적 데이터 모델을 최적화하기 위해 시도에서

이후 CHECK 제약 조건을 사용하여 CommEventPurpose의 모든 인스턴스에 대해 하나의 BOOLEAN 특성 만 TRUE가 될 수 있도록합니다.

이 접근법을 채택 할 때 성능 및 공간 상충 관계는 무엇입니까?

플랫폼 : MySQL의

+1

자세한 내용을 담고있는 다른 테이블에 연결된'CommEventPurposeType' 컬럼을'boolean' 타입으로 대체하려고합니까? 저에게는 2 가지 이상의 타입이있을 수 있습니다. 왜 부울 타입으로 대체할까요? –

답변

0

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 열과 똑같이 작동합니다.

+0

감사합니다 스펜서! 잘 했어. 그러나 응용 프로그램 계층에서 사용자가 명시 적으로 선택 사항을 볼 수있게하고 싶었습니다. 조회/형식 테이블은 드롭 다운 목록으로 구현할 수 있습니다. 선택/데이터 입력 전에 'ENUM'목록의 값을 사용자에게보고 할 수 있습니까? –