Вопрос

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

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

  2. Используйте поле char с двумя значениями «Y» или «N».

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

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

Это было полезно?

Решение

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

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

Наиболее часто встречающийся дизайн-имитировать множество логических флагов, которые используют представления о словаре данных Oracle, выбрав «Y» для True и «n» для False.Однако, чтобы правильно взаимодействовать со средами хоста, такими как JDBC, OCKI и другие среды программирования, лучше выбрать 0 для FAST и 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);`

Другие советы

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

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

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

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

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

  • Языконезависимый.«Y» и «N» было бы хорошо, если бы все их использовали.Но они этого не делают.Во Франции используют «О» и «Н» (я видел это собственными глазами).Я не программировал в Финляндии, чтобы узнать, используют ли они там «Е» и «К» — без сомнения, они умнее этого, но вы не можете быть уверены.
  • Соответствует практике использования широко используемых языков программирования (C, C++, Perl, Javascript)
  • Лучше работает с прикладным уровнем, например.Спящий режим
  • Приводит к более краткому 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

Преимущества «Да»/«Нет»:

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top