Использование [0,1] вместо [“Y”, “N”] вместо [“T”, “F”] в логическом / логическом поле базы данных?

StackOverflow https://stackoverflow.com/questions/1908454

Вопрос

Просто из любопытства и за отсутствия определенного ответа...

Я просто просматривал некоторые данные, которые отправляются нам от третьей стороны, и их поле "Пол" - это [0,1], обозначающее либо Женщину (0), либо Мужчину (1).

Есть ли какая-нибудь лучшая причина использовать [0,1] вместо ["F", "M"]?

Зависит ли это от сценария и интуитивности между полем и его значением?

Скорость доступа к данным и / или ограничения по размеру?

Если луна полная?


Каковы различия в использовании [0,1] по сравнению с ["Y", "N"] по сравнению с ["T", "F"]?

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

Решение

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

Кроме того, с философской точки зрения, наши представления о гендере / сексуальности гораздо более изменчивы, чем принято считать в бинарном поле.Например, меня наняли для исправления крупной правительственной заявки в Массачусетсе, когда были приняты законы об однополых браках, потому что было сделано множество предположений о браке, которые позже были признаны недействительными.

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

Лучше использовать 0 и 1 вместо F и M, если вы хотите запутать свои данные, чтобы другим программистам было трудно их понять.

В противном случае, нет, в этом нет никакого преимущества.

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

Изначально приложение отслеживало только самцов и самок.Но теперь нам нужно отследить три разных пола:самец, самка и курган (термин, обозначающий кастрированную свинью).Было бы непросто изменить это, если бы кто-то решил использовать 0 и 1 в битовом поле для обозначения пола.

Разве мы не упускаем из виду очевидное использование -> внешние ключи?Я знаю, что исходный вопрос подразумевал битовое поле, но если оно действительно числовое, может ли столбец 0,1 gender ссылаться на таблицу gender?

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

Я думаю, что "M" или "F" понятнее, потому что они предоставляют больше семантической информации.

Я бы создал пользовательский тип в sql или класс enum в c # / vb и сохранил 0,1 в базе данных по ранее указанным причинам размера и скорости.

Любопытно, что никто не упоминал языки.
М / Ф - это нормально на английском, но как насчет других языков?

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

Битовое (или логическое) поле следует использовать только тогда, когда есть определенно только 2 варианта.

Мои два цента.

Это действительно не имеет значения.

Если вы действительно, очень, очень беспокоитесь об ограничениях размера, [0,1] сэкономит вам несколько бит.

Ну, сравнивать целые числа немного проще, чем сравнивать строки;при сравнении строк вы должны учитывать заглавные и строчные буквы.

Различия в производительности будут незначительными.Выбирайте более интуитивно понятный для людей M / F.

Почему бы не использовать перечисление?Это позволяет вам

  1. убедитесь, что вы всегда должны использовать правильный тип, что потенциально уменьшает количество ошибок
  2. разрешить базе данных потенциально оптимизировать количество используемых битов
  3. получайте удобочитаемый вывод бесплатно

Короткий ответ - нет, поскольку один символ занимает то же место в памяти, что и целое число.

Длинный ответ заключается в том, что это зависит от того, как написано ваше приложение.Однажды я написал приложение, у которого в базе данных было поле gender с 0 или 1, потому что на прикладном уровне у меня было перечисление, которое сопоставляло значения Gender.Female и Gender.Male со значениями 0 и 1 соответственно.

Что ж, в SQL Server это определенно имело бы значение.В этом случае вам следует использовать тип столбца bit (1/0 или True / False - как бы вы ни хотели это сказать).Это всего лишь 1 бит памяти по сравнению с 1 байтом для символа (1).

Для флагов в записи я предпочитаю "Y" / "N" или "T" / "F" равным 1/0.

Если вы хотите сформулировать флаг как вопрос, использование Y / N дает понять, что "Y" согласен с положительным ответом на вопрос, а "N" означает отрицательный ответ, например

SHOULD_SPECIAL_DISCOUNT_APPLY - Y or N

Если вы хотите сформулировать флаг как положительное утверждение, Т/Ф понятнее.T - означает, что утверждение истинно, F означает, что утверждение ложно:

SPECIAL_DISCOUNT_APPLIES - T or F

0 или 1 не имеют прямого сопоставления с True или False - это зависит от того, в какую сторону это подразумевается.Вы не можете гарантировать, что "1" означает True / Да, а "0" означает False / Нет - так не всегда бывает в электронике и программном обеспечении, это зависит от того, насколько последовательным был программист и насколько правильно названы поля...

Действительно зависит от базы данных.

  • SQL Server использует бит
  • MySQL использует tinyint
  • Хранение T / F будет составлять, по крайней мере, символ (1)

Прочитав все это и проведя небольшое исследование, я пришел к выводу, что:

  • [0,1] поле полезно, потому что оно международное и может быть расширено для включения большего количества предложений, когда связано со статической таблицей определений.

  • ["Y", "N"] и ["T", "F"], вероятно, признаны во всем мире, но связаны с английским языком.

  • поля типа пола ["M", "F"] являются Также на английском языке и ограничивает использование при рассмотрении вопроса о ком-то, кто не хочет упоминать свой пол или чей пол не поддается определению (гермафродит)

Поскольку пол на самом деле не является бинарным - существует непрерывный диапазон "интерсексуальных" состояний между мужчинами и женщинами, а также существами без пола вообще, - лучше всего использовать тип с плавающей запятой.0 для самок (по умолчанию, по крайней мере, у млекопитающих), 1 для самцов с промежуточными значениями для промежуточных состояний и NaN для тех, у кого значения нет.

Но помните, это никогда не будет применимо в полной мере, потому что нет типа для человеческого сердца.Хотя комплекс часто является хорошим приближением.

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