Что использовать, если не используется логический тип? - PullRequest
3 голосов
/ 04 сентября 2011

Хорошо, это может быть мозговой вопрос, но мне любопытно.

Я часто сталкиваюсь с ситуацией, когда мне нужно хранить 1 из 3 значений в базе данных. Например, если мое приложение спрашивает «Продается ли этот дом?», Пользователь должен иметь возможность сказать «да», «нет», но иногда пользователь не знает. Так что есть также «я не знаю».

Я всегда испытываю желание установить тип данных как Boolean, но, конечно, это дает мне только «да» или «нет», и обычно по умолчанию устанавливается «нет».

Мне любопытно, какой тип данных считается обычной практикой в ​​этом сценарии?

Я мог бы использовать целое число и хранить «1», «2» или «3». Или я мог бы хранить строковое значение, или, или, или.

Это, вероятно, глупый вопрос, и, возможно, существует миллион способов сделать это. но если кто-то знает метод наилучшей практики и почему это было бы полезно. Спасибо.

Ответы [ 5 ]

3 голосов
/ 04 сентября 2011

В базе данных логическое значение может фактически выражать три состояния - true, false и NULL (при условии, что вы разрешите NULL в столбце).

Используйте NULL для "Я не знаю".

(И, вероятно, для столбца по умолчанию также устанавливается значение NULL)

РЕДАКТИРОВАТЬ: Хотя, подумав об этом, это может быть проблематично в зависимости от вашего варианта использования. Некоторые языки высокого уровня (например, Java) преобразуют NULL в false в наборе результатов запроса.

:: shrug :: Использовать varchar (1) ('t', 'f', 'u') или наименьшее доступное целочисленное значение (из соображений пробела) ... все в порядке.

Использование enum - это еще один вариант, но имейте в виду, что он не переносим (Oracle является заметным потомком проблемы).

1 голос
/ 04 сентября 2011

Вы можете использовать NULL для "Я не знаю".Вы все еще должны иметь возможность ИСТИНА и ЛОЖЬ для своего столбца логического типа.

0 голосов
/ 04 сентября 2011

Это зависит от того, какие типы данных поддерживает сервер. Каждый тип данных длиной 1 байт может содержать до 255 различных значений. В MySQL, например, вы можете использовать TINYINT. Определите числовые константы в вашем коде и используйте возможное целочисленное представление в наименьшем размере.

0 голосов
/ 04 сентября 2011

Я бы не советовал использовать NULL для "Я не знаю" по следующим причинам:

В коде вы обычно проверяете значение bool, спрашивая что-то вроде этого:

IF myBool THEN...

Или

IF NOT myBool THEN...

... как таковой, вы не можете определить разницу между ложным и «я не знаю»

Кроме того, я нашелДля моей собственной ситуации рекомендуется всегда иметь значение по умолчанию (false) для bools в моей базе данных.Одним из прямых эффектов нулей в поле bool могут быть ошибки в сторонних инструментах (таких как MS Access, устанавливающий соединение ODBC с серверной частью SQL-Server), которые не могут корректно / точно обрабатывать нули в полях bool.

Итак, что касается того, что я действительно рекомендую - я бы сказал, найдите ваш тип данных с наименьшим числом (например, tinyint в TSQL) и согласитесь с этим.Тогда вы можете иметь 0 = false, 1 = true, 2 = IDK.

0 голосов
/ 04 сентября 2011

Также вы можете использовать

ENUM('first','second','third')

это может быть полезно не только для целых чисел, но и для строковых значений

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...