Булево поле в Oracle - PullRequest
       32

Булево поле в Oracle

145 голосов
/ 27 августа 2008

Вчера я хотел добавить логическое поле в таблицу Oracle. Однако в Oracle нет логического типа данных. Кто-нибудь здесь знает лучший способ симулировать логическое значение? Погуглив тему обнаружил несколько подходов

  1. Используйте целое число и просто не удосуживайтесь присвоить ему что-либо кроме 0 или 1.

  2. Используйте поле типа char с Y и N в качестве единственных двух значений.

  3. Используйте перечисление с ограничением CHECK.

Знают ли опытные разработчики Oracle, какой подход является предпочтительным / каноническим?

Ответы [ 8 ]

82 голосов
/ 27 августа 2008

Я нашел эту ссылку полезной.

Вот параграф, освещающий некоторые плюсы и минусы каждого подхода.

Наиболее часто встречающийся дизайн - это имитация множества логических Флаги, которые используют представления словаря данных Oracle, выбирая «Y» для true и «N» для ложного. Однако для правильного взаимодействия с хостом среды, такие как JDBC, OCCI и другие среды программирования, лучше выбрать 0 для ложного и 1 для истинного, чтобы он мог работать правильно с функциями getBoolean и setBoolean.

По сути, они отстаивают метод № 2 для эффективности, используя

  • значения из 0/1 (из-за совместимости с JDBC getBoolean() и т. Д.) С проверочным ограничением
  • a введите из CHAR (поскольку он использует меньше места, чем NUMBER).

Их пример:

create table tbool (bool char check (bool in (0,1));
insert into tbool values(0);
insert into tbool values(1);`
28 голосов
/ 21 октября 2008

Oracle сам использует Y / N для логических значений. Для полноты следует отметить, что pl / sql имеет логический тип, а не только таблицы.

Если вы используете поле, чтобы указать, нужно ли обрабатывать запись или нет, вы можете рассмотреть возможность использования Y и NULL в качестве значений. Это дает очень маленький (быстро читаемый) индекс, который занимает очень мало места.

26 голосов
/ 27 августа 2008

Чтобы использовать наименьшее количество места, вы должны использовать поле CHAR, ограниченное 'Y' или 'N'. Oracle не поддерживает типы данных BOOLEAN, BIT или TINYINT, поэтому один байт CHAR настолько мал, насколько вы можете получить.

19 голосов
/ 06 мая 2013

Наилучшим вариантом являются 0 и 1 (в виде чисел - другой ответ предлагает 0 и 1 как CHAR для эффективности использования пространства, но для меня это слишком извращено), используя NOT NULL и проверочное ограничение для ограничить содержимое этими значениями. (Если вам нужно, чтобы столбец обнулялся, то вы имеете дело не с логическим значением, а с перечислением трех значений ...)

Преимущества 0/1:

  • Язык не зависит. «Y» и «N» было бы хорошо, если бы все использовали это. Но они этого не делают. Во Франции они используют «O» и «N» (я видел это своими глазами). Я не программировал в Финляндии, чтобы увидеть, используют ли они там «E» и «K» - без сомнения, они умнее этого, но вы не можете быть уверены.
  • Соответствует практике в широко используемых языках программирования (C, C ++, Perl, Javascript)
  • Лучше играет на прикладном уровне, например Hibernate
  • Приводит к более лаконичному SQL, например, чтобы узнать, сколько бананов готово к употреблению select sum(is_ripe) from bananas вместо 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
  • Это то, что предлагает Oracle, так что, возможно, некоторые люди более привыкли к

Другой плакат предложил «Y» / ноль для повышения производительности. Если вы доказали , что вам нужна производительность, то достаточно справедливо, но в противном случае избегайте, так как это делает запросы менее естественными (some_column is null вместо some_column = 0) и в левом соединении вы будете ошибаться с несуществующими записями.

5 голосов
/ 31 августа 2008

Либо 1/0, либо Y / N с проверочным ограничением. Эфирный путь в порядке. Лично я предпочитаю 1/0, так как много работаю над Perl, и это действительно облегчает выполнение логических операций Perl над полями базы данных.

Если вы хотите действительно всесторонне обсудить этот вопрос с одним из оракулов Хонко, посмотрите, что Том Кайт говорит по этому поводу Здесь

4 голосов
/ 27 августа 2008

База данных, над которой я работал большую часть своей работы, использовала 'Y' / 'N' как логическое значение. С этой реализацией вы можете выполнить некоторые приемы, такие как:

  1. Количество строк, которые являются истинными:
    ВЫБЕРИТЕ СУММУ (СЛУЧАЙ, КОГДА BOOLEAN_FLAG = 'Y' ТОГДА 1 ИЛИ 0) ОТ X

  2. При группировании строк используйте логику «Если одна строка истинна, тогда все верны»:
    ВЫБЕРИТЕ МАКС. (BOOLEAN_FLAG) ОТ Y
    И наоборот, используйте MIN для принудительной группировки false, если одна строка имеет значение false.

2 голосов
/ 04 октября 2016

Рабочий пример реализации принятого ответа путем добавления столбца «Boolean» в существующую таблицу в базе данных 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.

1 голос
/ 27 августа 2008

В наших базах данных мы используем перечисление, которое гарантирует, что мы передадим ему значение ИСТИНА или ЛОЖЬ. Если вы сделаете это любым из первых двух способов, слишком легко либо начать добавлять новое значение к целому числу, не проходя правильного проектирования, либо заканчивая тем, что поле char имеет Y, y, N, n, T, t, Значения F, f и необходимость помнить, какой раздел кода использует какую таблицу и какую версию true она использует.

...