Логическое поле в Oracle

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

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

  • Используйте поле char с 'Y' или 'N' как только два значения.

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

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

Ответ 1

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

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

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

В основном они выступают за метод номер 2, с большей эффективностью, используя

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

Пример:

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

  • Не зависит от языка. "Y" и "N" были бы хороши, если бы все использовали его. Но они этого не делают. Во Франции они используют "O" и "N" (я видел это своими глазами). Я не запрограммировал в Финляндии, чтобы увидеть, используют ли они "E" и "K" - без сомнения, они умнее, но вы не можете быть уверены.
  • Соответствует практике в широко используемых языках программирования (C, С++, Perl, Javascript).
  • Воспроизведение лучше с помощью прикладного уровня, например. Hibernate
  • Приводит к более сжатому SQL, например, чтобы узнать, сколько бананов готовы съесть select sum(is_ripe) from bananas вместо select count(*) from bananas where is_ripe = 'Y' или даже (yuk) select sum(case is_ripe when 'Y' then 1 else 0) from bananas

Преимущества "Y" / "N" :

  • Занимает меньше места, чем 0/1
  • Это то, что предлагает Oracle, может быть, некоторые люди более привыкли к

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

Ответ 5

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

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

Ответ 6

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

  • Считайте строки, которые являются истинными:
    SELECT SUM (CASE WHEN BOOLEAN_FLAG = 'Y' THEN 1 ELSE 0) FROM X

  • При группировке строк применяйте "Если одна строка истинна, то все являются истинными" логикой:
    SELECT MAX (BOOLEAN_FLAG) FROM Y
    И наоборот, используйте MIN, чтобы принудительно группировать false, если одна строка имеет значение false.

Ответ 7

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

Ответ 8

В наших базах данных мы используем перечисление, которое гарантирует, что мы передадим его либо TRUE, либо FALSE. Если вы сделаете это либо из первых двух способов, либо слишком легко либо начать добавлять новое значение в целое число, не пройдя надлежащий дизайн, либо заканчивая тем полем char, где Y, y, N, n, T, t, F, f и необходимо запомнить, какой раздел кода использует ту таблицу и какую версию истины она использует.