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

126

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

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

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

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

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

  • 189
    Я бы хотел, чтобы у Oracle был тип данных wall чтобы я мог разбить себе голову, используя булевы значения.
Теги:
boolean
sqldatatypes

8 ответов

73
Лучший ответ

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

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

Наиболее часто встречающийся дизайн - подражать многим булевым флаги, которые используются в представлении словаря данных 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);`
  • 31
    Я не советую использовать 'N' и 'Y', поскольку это зависит от языка. Англоязычные люди иногда забывают, что большая часть мира не представляет концепцию истины буквой Y. Напротив, значение 0 и 1 постоянно в языковых барьерах.
  • 6
    0 и 1 как логические значения не согласуются в компьютерных науках - языки сценариев оболочки имеют тенденцию иметь 0 как успех, и ненулевые как сбой, в то время как языки типа C имеют тенденцию иметь 0 как сбой, так и ненулевые как успех.
Показать ещё 2 комментария
27

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

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

  • 7
    +1 Хороший вопрос о внутренних представлениях и таблицах Oracle, использующих Y / N. Если Oracle делает это таким образом, это должно быть правильно! :)
  • 0
    Можете ли вы объяснить, как Y и NULL составляют небольшой индекс по сравнению с Y и N?
Показать ещё 1 комментарий
24

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

19

Наилучший вариант - 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), а в левом соединении вы скомбинируете фальшь с несуществующими записями.

  • 3
    Вы обнаруживаете, что в наши дни многие логические значения являются TriState, то есть true, false и unknown. который идеально подходит для нулевой идеи базы данных. просто потому, что много раз, зная, что ответ не был дан, жизненно важно
  • 1
    Да, истина-ложь-неизвестность может потребоваться, хотя, если бы я был разборчив (а я), я бы сказал, что это не должно быть описано как логическое значение, потому что это не так.
Показать ещё 7 комментариев
5

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

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

  • 0
    Говорят, что 1/0 "менее эффективно использует память", но ... мне это тоже нравится больше (и hibernate, по-видимому, требует 1/0 для логического значения)
  • 0
    1/0 - это Hibernate по умолчанию для логического значения, но вы можете определить любое пользовательское сопоставление, которое вам нравится.
Показать ещё 1 комментарий
4

В базе данных я большую часть своей работы использовал для использования '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.

  • 4
    на самом деле показанные примеры полезны и для подхода 0/1 - и, ИМХО, быстрее.
2

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

1

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню