문제

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

  1. 정수를 사용하고 0 또는 1 이외의 값을 지정하지 마십시오.

  2. 'Y'또는 'N'을 두 값으로 만 사용하는 문자 필드를 사용합니다.

  3. 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'을 부울로 사용했습니다.이 구현으로 다음과 같은 트릭을 얻을 수 있습니다.

  1. 참인 행 수 :
    X에서 SUM (CASE WHEN BOOLEAN_FLAG= 'Y'THEN 1 ELSE 0) 선택

  2. 행을 그룹화 할 때 "한 행이 참이면 모두 참"논리를 적용하십시오.
    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를 사용하는지 기억해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top