문제
어제 Oracle 테이블에 부울 필드를 추가하고 싶었습니다.그러나 실제로 Oracle에는 부울 데이터 유형이 없습니다.여기 누구든지 부울을 시뮬레이션하는 가장 좋은 방법을 알고 있습니까?주제 검색을 통해 여러 접근 방식을 발견했습니다.
-
정수를 사용하고 0 또는 1 이외의 값을 지정하지 마십시오.
-
'Y'또는 'N'을 두 값으로 만 사용하는 문자 필드를 사용합니다.
-
CHECK 제약 조건과 함께 열거 형을 사용합니다.
경험있는 Oracle 개발자가 어떤 접근 방식이 선호되고 표준 적인지 알고 있습니까?
해결책
이것을 찾았습니다. 링크가 유용합니다.
다음은 각 접근 방식의 장단점을 강조하는 단락입니다. <인용구>
가장 흔히 볼 수있는 디자인은 부울과 유사한 Oracle의 데이터 딕셔너리 뷰가 사용하는 플래그를 지정하고 true 인 경우 'Y'를 선택합니다. 거짓이면 'N'. 그러나 호스트와 올바르게 상호 작용하려면 JDBC, OCCI 및 기타 프로그래밍 환경과 같은 환경, 0을 거짓으로 선택하고 1을 참으로 선택하는 것이 좋습니다. getBoolean 및 setBoolean 함수로 올바르게.
기본적으로 그들은 효율성을 위해 2 번 방법을 옹호합니다.
- 값 0/1 (JDBC의
getBoolean()
와의 상호 운용성 등으로 인해)와 검사 제약 조건 - CHAR의 유형 (NUMBER보다 적은 공간을 사용하기 때문).
그들의 예 : <인용구> 라코 디스
다른 팁
Oracle 자체는 부울 값에 Y / N을 사용합니다.완전성을 위해 pl / sql에는 부울 유형이 있으며 그렇지 않은 테이블 일 뿐이라는 점에 유의해야합니다.
레코드를 처리해야하는지 여부를 나타 내기 위해 필드를 사용하는 경우 값으로 Y 및 NULL을 사용하는 것을 고려할 수 있습니다.이것은 아주 작은 공간을 차지하는 아주 작은 (빠른 읽기) 인덱스를 만듭니다.
최소한의 공간을 사용하려면 'Y'또는 'N'으로 제한되는 CHAR 필드를 사용해야합니다.Oracle은 BOOLEAN, BIT 또는 TINYINT 데이터 유형을 지원하지 않으므로 CHAR의 1 바이트는 가능한 한 작습니다.
가장 좋은 옵션은 NOT NULL 및 검사 제약 조건을 사용하는 0과 1입니다 (숫자로-다른 대답은 공간 효율성을 위해 CHAR 으로 0과 1을 제안하지만 저에게는 너무 꼬여 있음). 내용을 해당 값으로 제한합니다. (열이 널 입력 가능해야하는 경우 처리중인 부울이 아니라 세 개의 값이있는 열거 형입니다 ...)
0/1의 장점 :
- 언어 독립적. 모두가 사용한다면 'Y'와 'N'은 괜찮을 것입니다. 그러나 그들은 그렇지 않습니다. 프랑스에서는 'O'와 'N'을 사용합니다 (직접 본 적이 있습니다). 핀란드에서 'E'와 'K'를 사용하는지 여부를 확인하도록 프로그래밍 한 적이 없습니다. 의심 할 여지없이 그보다 더 똑똑하지만 확신 할 수는 없습니다.
- 광범위하게 사용되는 프로그래밍 언어 (C, C ++, Perl, Javascript)에 대한 실습과 일치
- 애플리케이션 레이어에서 더 잘 작동합니다. 최대 절전 모드
- 예를 들어 얼마나 많은 바나나가
select sum(is_ripe) from bananas
또는 (yuk)select count(*) from bananas where is_ripe = 'Y'
대신select sum(case is_ripe when 'Y' then 1 else 0) from bananas
를 먹을 준비가되었는지 알아보기 위해보다 간결한 SQL로 안내합니다.'Y'/ 'N'의 장점 :
- 0/1보다 적은 공간을 차지합니다.
- 오라클이 제안한 것이므로 일부 사람들이 더 익숙한 것일 수 있습니다
다른 포스터에서는 성능 향상을 위해 'Y'/ null을 제안했습니다. 성능이 필요하다는 것을 증명 했다면 충분히 공평하지만 그렇지 않으면 쿼리가 덜 자연스럽고 (
some_column is null
대신some_column = 0
) 왼쪽 조인에서 거짓과 존재하지 않는 레코드를 혼합하게되므로 피하세요. .
확인 제약 조건이있는 1/0 또는 Y / N입니다.에테르 방식은 괜찮습니다.Perl에서 많은 작업을 수행하기 때문에 개인적으로 1/0을 선호하며 데이터베이스 필드에서 perl Boolean 연산을 정말 쉽게 수행 할 수 있습니다.
오라클 헤드 혼초 중 한 명과이 질문에 대해 깊이있는 토론을 원한다면 Tom Kyte가이 여기
내 작업의 대부분을 수행 한 데이터베이스는 'Y'/ 'N'을 부울로 사용했습니다.이 구현으로 다음과 같은 트릭을 얻을 수 있습니다.
-
참인 행 수 :
X에서 SUM (CASE WHEN BOOLEAN_FLAG= 'Y'THEN 1 ELSE 0) 선택 -
행을 그룹화 할 때 "한 행이 참이면 모두 참"논리를 적용하십시오.
Y에서 MAX (BOOLEAN_FLAG) 선택
반대로 한 행이 거짓이면 MIN을 사용하여 그룹화를 강제로 거짓으로 만듭니다.
오라클 데이터베이스의 기존 테이블에 "Boolean"열을 추가하여 허용 된 답변을 구현하는 작업 예제 (number
유형 사용) :
라코 디스
그러면 기본값이 0 인 my_table_name
라는 my_new_boolean_column
라는 새 열이 생성됩니다.이 열은 NULL
값을 허용하지 않으며 허용되는 값을 0
또는 1
로 제한합니다.
데이터베이스에서는 TRUE 또는 FALSE 중 하나를 전달하도록하는 열거 형을 사용합니다.처음 두 가지 방법 중 하나를 수행하면 적절한 디자인을 거치지 않고 정수에 새로운 의미를 추가하기 시작하거나 Y, y, N, n, T, t를 갖는 char 필드로 끝나는 것이 너무 쉽습니다.F, f 값 및 코드의 어떤 섹션이 어떤 테이블을 사용하고 어떤 버전의 true를 사용하는지 기억해야합니다.