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

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

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

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

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

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

8 ответов


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

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

наиболее часто встречающийся дизайн должен имитировать многие булевы как флаги, которые используют представления словаря данных Oracle, выбрав " Y " для true и " N " для false. Однако, чтобы правильно взаимодействовать с хостом среды, такие как 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 для эффективности пространства, но это слишком скручено для меня), используя не NULL и контрольное ограничение, чтобы ограничить содержимое этими значениями. (Если вам нужно, чтобы столбец был nullable, то это не логическое значение, с которым вы имеете дело, а перечисление с тремя значениями...)

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

  • независимый язык. "Y" и " N " были бы в порядке, если бы все использовали его. Но это не так. Во Франции используют " О " и " н " (я видел это собственными глазами). Я не программировал в Финляндии, чтобы посмотреть, используют ли они там " Е " и " к " - Без сомнения, они умнее, но вы не можете быть уверены.
  • соответствует практике в широко используемых языках программирования (C, C++, Perl, Javascript)
  • лучше играет с прикладным уровнем, например, Hibernate
  • приводит к более лаконичному SQL, например, чтобы узнать, сколько бананов готовы ешь!--0--> вместо 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 " / null для повышения производительности. Если ты ... --6-->проверенные что вам нужна производительность, то достаточно справедливо, но в противном случае не избежать, так как это делает запрос менее натуральный (some_column is null вместо some_column = 0) и в левом соединении вы будете смешивать ложность с несуществующими записями.


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

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


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

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

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


рабочий пример реализации принятого ответа путем добавления столбца "Boolean" в существующую таблицу в базе данных oracle (используя number type):

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 он использует.