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


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

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

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

  3. использовать перечислимый с ограничением проверки.

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

8 141

8 ответов:

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

вот абзац, выделяющий некоторые плюсы / минусы каждого подхода.

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

в основном они выступают за то, Способ № 2, в целях повышения эффективности работы, используя

  • значения 0/1 (из-за совместимости с JDBC getBoolean() etc.) с проверочным ограничением
  • a тип из 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 в качестве значений. Это делает для очень маленького (читаемого быстро) индекса, который занимает очень мало места.

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

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

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

  • язык не зависит. "Y" и " N " были бы в порядке, если бы все использовали его. Во Франции они используют "О" и " н " (я видел это своими глазами). Я не программировал в Финляндии, чтобы увидеть, используют ли они " Е " и " к " там - без сомнения, они умнее, но вы не можете быть уверены.
  • соответствует практике в широко используемых языках программирования (C, 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) и в левом соединении вы объедините ложность с несуществующими записями.

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

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

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

  1. количество строк, которые являются истинными:
    ВЫБЕРИТЕ SUM (CASE WHEN BOOLEAN_FLAG = 'Y' THEN 1 ELSE 0) ИЗ X

  2. при группировке строк примените логику "если одна строка истинна, то все истинны":
    ВЫБЕРИТЕ MAX (BOOLEAN_FLAG) ИЗ Y
    И наоборот, используйте MIN для принудительного группирования false, если одна строка ложный.

рабочий пример реализации принятого ответа путем добавления столбца "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.

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