IT story

Oracle의 부울 필드

hot-time 2020. 6. 16. 08:03
반응형

Oracle의 부울 필드


어제 Oracle 테이블에 부울 필드를 추가하고 싶었습니다. 그러나 Oracle에는 실제로 부울 데이터 유형이 없습니다. 여기 누구든지 부울을 시뮬레이션하는 가장 좋은 방법을 알고 있습니까? 인터넷 검색에서 몇 가지 접근 방식이 발견되었습니다.

  1. 정수를 사용하고 0 또는 1 이외의 다른 것을 할당하지 마십시오.

  2. 두 개의 값으로 'Y'또는 'N'이있는 문자 필드를 사용하십시오.

  3. CHECK 제약 조건과 함께 열거 형을 사용하십시오.

숙련 된 Oracle 개발자는 어떤 접근 방식이 선호 / 정규인지 알고 있습니까?


링크가 유용하다는 것을 알았습니다 .

다음은 각 접근법의 장단점을 강조한 단락입니다.

가장 일반적으로 보이는 디자인은 Oracle의 데이터 사전보기에서 사용하는 많은 부울 유사 플래그를 모방하여 'Y'를 true로, 'N'을 false로 선택하는 것입니다. 그러나 JDBC, OCCI 및 기타 프로그래밍 환경과 같은 호스트 환경과 올바르게 상호 작용하려면 getBoolean 및 setBoolean 함수에서 올바르게 작동 할 수 있도록 false로 0을, true로 1을 선택하는 것이 좋습니다.

기본적으로 그들은 효율성을 위해 방법 번호 2를 옹호합니다.

  • getBoolean()점검 제한 조건이있는 0/1의 (JDBC 등과 의 상호 운용성으로 인해 )
  • CHAR의은 (그 수보다 적은 공간을 사용하기 때문에).

그들의 예 :

create table tbool (bool char check (bool in (0,1));
insert into tbool values(0);
insert into tbool values(1);`

Oracle 자체는 부울 값에 Y / N을 사용합니다. 완전성을 위해 pl / sql에는 부울 유형이 있으며 그렇지 않은 테이블 일뿐입니다.

필드를 사용하여 레코드를 처리해야하는지 여부를 표시하는 경우 Y 및 NULL을 값으로 사용하는 것을 고려할 수 있습니다. 따라서 공간을 거의 차지하지 않는 매우 작은 (빠른 읽기) 인덱스가 만들어집니다.


최소량의 공간을 사용하려면 'Y'또는 'N'으로 제한된 CHAR 필드를 사용해야합니다. Oracle은 BOOLEAN, BIT 또는 TINYINT 데이터 유형을 지원하지 않으므로 CHAR의 1 바이트는 가능한 한 작습니다.


가장 좋은 옵션은 0과 1입니다 (숫자-다른 대답은 공간 효율을 위해 CHAR 로 0과 1을 제안 하지만 나에게는 너무 꼬임입니다). NOT NULL과 검사 제한 조건을 사용하여 내용을 해당 값으로 제한합니다. (열이 널 입력 가능 해야하는 경우 처리하는 부울이 아니라 세 개의 값을 가진 열거입니다 ...)

0/1의 장점 :

  • 언어 독립적. 모두가 사용한다면 'Y'와 'N'은 괜찮을 것입니다. 그러나 그들은하지 않습니다. 프랑스에서는 'O'와 'N'을 사용합니다 (내 눈으로 이것을 보았습니다). 핀란드에서 'E'와 'K'를 사용하는지 여부를 확인하도록 프로그래밍하지 않았습니다. 의심 할 여지없이 그보다 똑똑하지만 확실하지는 않습니다.
  • 널리 사용되는 프로그래밍 언어 (C, C ++, Perl, Javascript) 연습에 적합
  • 응용 프로그램 계층 (예 : 최대 절전 모드)으로 더 잘 재생
  • 예를 들어, 얼마나 많은 바나나가 먹을 수 있는지 또는 심지어 select sum(is_ripe) from bananas먹을 수 있는지를 알기 위해 더 간결한 SQL로 연결됩니다.select count(*) from bananas where is_ripe = 'Y'select sum(case is_ripe when 'Y' then 1 else 0) from bananas

'Y'/ 'N'의 장점 :

  • 0/1보다 적은 공간을 차지합니다
  • 오라클이 제안한 것이므로 일부 사람들이 더 익숙한 것일 수도 있습니다.

다른 포스터는 성능 향상을 위해 'Y'/ 널을 제안했습니다. 성능이 필요 하다는 것이 입증 되었으면 충분히 공평하지만 그렇지 않으면 피하는 것이 자연스럽지 some_column is null않고 () 대신 some_column = 0왼쪽 조인으로 인해 거짓이 존재하지 않는 레코드와 충돌 하기 때문에 피하십시오 .


점검 제한 조건이있는 1/0 또는 Y / N입니다. 에테르 방식은 괜찮습니다. 개인적으로 perl에서 많은 작업을 수행하므로 개인적으로 1/0을 선호하며 데이터베이스 필드에서 perl 부울 연산을 수행하기가 정말 쉽습니다.

당신이 오라클 머리 honchos 중 하나가이 문제의 정말 깊이 토론을 원하는 경우에, 톰 카이트는 이것에 대해 무슨 얘기 체크 아웃 여기에


내가 작업 한 대부분의 데이터베이스는 'Y'/ 'N'을 부울로 사용했습니다. 이 구현으로 다음과 같은 몇 가지 트릭을 시작할 수 있습니다.

  1. 참인 행 수 :
    SELECT SUM (CASE WHEN BOOLEAN_FLAG = 'Y'THEN 1 ELSE 0) FROM X

  2. 행을 그룹화 할 때 "한 행이 참이면 모두 참"논리를 적용하십시오.
    SELECT MAX (BOOLEAN_FLAG) FROM Y
    반대로, 한 행이 거짓이면 MIN을 사용하여 그룹화를 강제로 거짓으로 설정하십시오.


Oracle 데이터베이스의 기존 테이블에 "부울"열을 추가하여 허용되는 답변을 구현하는 실제 예제 ( number유형 사용 ) :

ALTER TABLE my_table_name ADD (
my_new_boolean_column number(1) DEFAULT 0 NOT NULL
CONSTRAINT my_new_boolean_column CHECK (my_new_boolean_column in (1,0))
);

이 새로운 열 생성 my_table_name이라는 my_new_boolean_column수락하지 않습니다 열 0의 기본 값으로 NULL값을하고 하나에 허용되는 값을 제한 0하거나 1.


In our databases we use an enum that ensures we pass it either TRUE or FALSE. If you do it either of the first two ways it is too easy to either start adding new meaning to the integer without going through a proper design, or ending up with that char field having Y, y, N, n, T, t, F, f values and having to remember which section of code uses which table and which version of true it is using.

참고URL : https://stackoverflow.com/questions/30062/boolean-field-in-oracle

반응형