Сохранение пола (пола) в базе данных

130

Я хочу сохранить пол пользователя в базе данных с минимальными затратами (размер / производительность).

Пока на ум приходят 3 сценария

  1. Int - выровнено с Enum в коде (1 = Мужской, 2 = Женский, 3 = ...)
  2. char (1) - сохранить m , f или другой односимвольный идентификатор
  3. Бит (логический) - есть ли подходящее имя поля для этой опции?

Я спрашиваю потому , что из этого ответа , который упоминает , что символы имеют меньше , чем булевы .

Я должен уточнить , что я использую MS SQL 2008, который делает на самом деле имеют битовый тип данных.

Marko
источник
1
FWIW, этот вопрос SO, на который вы ссылались, относится к тому, как .NET представляет эти типы в памяти. Это не имеет ничего общего с тем, как их представляет SQL Server. бит <= char. msdn.microsoft.com/en-us/library/ms177603.aspx
Мэтт,
1
Для чего вы используете поле «Пол»? Может ли это быть просто строка, чтобы люди могли вводить то, что им нравится? Попытка перечислить все возможные ответы на этот вопрос будет непростой задачей.
шуган
@ThePassenger: Я думаю, что обычный вариант - это в основном m / f / other, так что да, тройной, как вы предлагаете, это нормально. Возможно, вы захотите отличить «другое» от «неопределенного» (например, «я не говорю» и / или «мы еще не спросили пользователя»). Я не знаю, чтобы люди с изменчивым гендерным подходом хотели иметь значение с плавающей запятой с ползунком, который они могут устанавливать каждый день; Я предполагаю, что большинство из них (и другие люди, не принадлежащие к традиционному полу) были бы счастливы просто выбрать «другой» или «неуказанный» практически на любом веб-сайте. Но нет, я не думаю, что просить «пол» вместо «гендера» было бы хорошей идеей.
Питер Кордес
1
@PeterCordes Я плохо разбираюсь в «гендерной текучести», в моей деревне ты либо мужчина, либо женщина ... или корова. Если жанр сейчас подвижен, создание шкалы ценностей для звука компьютера кажется слишком большим, чтобы требовать. В моей стране мы предпочитаем секс, это менее сложно. О, не верьте, что мы так далеко находимся в каменном веке, а! Мы уже открыли для себя Бога, и мы по большей части монотеисты со времени последней колонизации.
Revolucion для Моники
2
@PeterCordes: поскольку требование таких вещей в текущем политическом климате даст людям преимущества, обеспечив им доминирование над другими, как только вы включите ползунок с плавающей запятой, кто-то выступит с требованием многомерного. «Всего один слайдер? Вы в каменном веке?»
vsz

Ответы:

83

Колонку я бы назвал «пол».

Data Type   Bytes Taken          Number/Range of Values
------------------------------------------------
TinyINT     1                    255 (zero to 255)
INT         4            -       2,147,483,648 to 2,147,483,647
BIT         1 (2 if 9+ columns)  2 (0 and 1)
CHAR(1)     1                    26 if case insensitive, 52 otherwise

Тип данных BIT может быть исключен, поскольку он поддерживает только два возможных пола, что неадекватно. Хотя INT поддерживает более двух вариантов, он занимает 4 байта - производительность будет лучше с меньшим / более узким типом данных.

CHAR(1)имеет преимущество перед TinyINT - оба занимают одинаковое количество байтов, но CHAR предоставляет более узкое количество значений. Использование CHAR(1)приведет к использованию естественных ключей «m», «f» и т. Д. По сравнению с использованием числовых данных, которые называются суррогатными / искусственными ключами. CHAR(1)также поддерживается в любой базе данных, если возникнет необходимость в переносе.

Вывод

Я бы использовал вариант 2: СИМВОЛ (1).

добавление

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

OMG Пони
источник
Есть ссылки на производительность? Я знаю, что это почти микрооптимизация, чего мне не следует делать, но это пища для моего любопытного ума.
Marko
Спасибо @OMG Ponies, а как насчет производительности? Будет ли в этом случае чугун дороже, чем немного?
Marko
4
@Marko: Как я уже сказал, они равны. Но индекс, скорее всего, не поможет, потому что в индексе для столбца с низкой мощностью нет значения. Это означает, что для индекса недостаточно разнообразия значений, чтобы обеспечить какое-либо значение.
OMG Ponies
1
Насколько лучше будет производительность на самом деле собираетесь использовать, скажем, тип данных 4 байт на 64-битной платформе? Просто говорю ... ;-)
Craig
1
Я бы предпочел немного, так как есть только два пола. Однако первоначальный вопрос OP остается: каким будет имя столбца? "IsMale" или "IsFemale" немного странно ...
Mateus Felipe
180

Для этого уже существует стандарт ISO; не нужно придумывать свою схему:

http://en.wikipedia.org/wiki/ISO_5218

Согласно стандарту, столбец должен называться «Пол», а «ближайший» тип данных - tinyint с ограничением CHECK или таблицей поиска, в зависимости от ситуации.

Pondlife
источник
4
Почему вместо «неприменимо» отображается 9? А как насчет 3-8?
Kenmore
4
Это для секса. ОП специально просил пол. Пол и гендер, вероятно, имеют разные возможные ценности, которые, возможно, потребуется зафиксировать.
indigochild
2
@indigochild ОП использует оба слова в заголовке вопроса и явно считает их эквивалентными, по крайней мере, для своего варианта использования (YMMV). Я просто хочу сказать, что в этой области существует стандарт ISO, и вам никогда не следует тратить время на разработку собственной схемы, когда существует официальный стандарт. Если, конечно, этот стандарт не распространяется на ваш конкретный случай, что вполне возможно.
Pondlife
1
Это должен быть принятый ответ. Он фокусируется на целостности данных (которая ~ навсегда) вместо оптимизации (которая носит ситуативный характер).
Пол Кантрелл
1
Это определенно должно быть ответом. @PeterCordes этот ISO используется для пола (биологический пол), а не для пола (как вы его называете) - объяснение здесь . Я предполагаю, что в случае, если вы хотите сохранить пол (что, я бы не знал, какое использование вы это делаете), крошечный int по-прежнему достаточно хорош, если вы хотите сохранить менее 255 полов (говоря fe 0 = неизвестно / не хочу заявлять, 1 = мужчина, 2 = женщина, 3 = мужчина, идентифицирующий себя как женщина, и т. д.)
SolidTerre
43

В медицине есть четыре пола: мужской, женский, неопределенный и неизвестный. Возможно, вам не понадобятся все четыре, но вам определенно понадобятся 1, 2 и 4. Не рекомендуется использовать значение по умолчанию для этого типа данных. Тем более рассматривать его как логическое значение с состояниями «есть» и «не».

Маркиз Лорн
источник
1
@EJP, интересно. У вас есть ссылка на это?
Marko
11
Мой отец, доктор медицины BS FRACP.
Marquis of Lorne
Основываясь на этой информации, я бы согласился с TinyIntenum (как предлагает Хьюго) и выбрал по крайней мере 1, 2 и 3 (Other).
IAbstract
1
@EJP, хотя ваш ответ, вероятно, правильный, он НЕ говорит, какой тип данных мне следует использовать, а скорее - каковы (технически) правильные полы.
Marko
17
Словарь данных Национальной службы здравоохранения Великобритании (NHS) определяет четыре значения: 0 = Not Known, 1 = Male, 2 = Female, 9 = Not Specified, которые отражают значения ISO 5218 . Обратите внимание, что есть два типа : пол при регистрации (обычно вскоре после рождения) и текущий.
однажды,
3

Int(Или TinyInt) выравниваются по Enumполю будет моя методика.

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

Во-вторых, строки / символы имеют для них «магическое значение», независимо от того, насколько очевидными они могут казаться во время разработки. Не говоря уже о том, что это позволяет людям хранить практически любую ценность, которую они не обязательно сопоставят с чем-то очевидным.

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

Хьюго
источник
2

Я использую char 'f', 'm' и 'u', потому что предполагаю пол по имени, голосу и разговору, а иногда и не знаю его. Окончательное решение - это их мнение.

На самом деле это зависит от того, насколько хорошо вы знаете человека и от того, какие у вас критерии: физическая форма или личность. Психологу могут понадобиться дополнительные варианты - переход к женщине, переход к мужчине, транс к женщине, транс к мужчине, гермафродит и не определившийся. С 9 вариантами, четко не определяемыми одним символом, я мог бы последовать совету Хьюго о крошечных целых числах.

zarac
источник
Не по теме. Это не ответ.
корыто
1

Вариант 3 - ваш лучший выбор, но не все движки БД имеют "битовый" тип. Если у вас нет немного, то TinyINT будет вашим лучшим выбором.

ajacian81
источник
-5
CREATE TABLE Admission (
    Rno INT PRIMARY KEY AUTO_INCREMENT,
    Name VARCHAR(25) NOT NULL,
    Gender ENUM('M','F'),
    Boolean_Valu boolean,
    Dob Date,
    Fees numeric(7,2) NOT NULL
);




insert into Admission (Name,Gender,Boolean_Valu,Dob,Fees)values('Raj','M',true,'1990-07-12',50000);
insert into Admission (Name,Gender,Boolean_Valu,Dob,Fees)values('Rani','F',false,'1994-05-10',15000);
select * from admission;

введите описание ссылки здесь

Мохаммад Асиф
источник
-5

Я бы выбрал вариант 3, но с несколькими столбцами битов NON NULLABLE вместо одного. IsMale (1 = Да / 0 = Нет) IsFemale (1 = Да / 0 = Нет)

если требуется: IsUnknownGender (1 = Да / 0 = Нет) и так далее ...

Это упрощает чтение определений, простоту расширения, простоту программирования, отсутствие возможности использования значений вне домена и отсутствие необходимости во второй таблице поиска + ограничения FK или CHECK для блокировки значений.

РЕДАКТИРОВАТЬ: Исправление, вам нужно хотя бы одно ограничение, чтобы убедиться, что установленные флаги действительны.

HansLindgren
источник
Было бы неплохо услышать, почему мой ответ не получил голосов?
HansLindgren
Без ограничений ничто не препятствует тому, чтобы все столбцы были равны 1 или все они были равны нулю. Это было бы бессмысленно, так как ваша схема не удовлетворяет одному из ваших требований.
Джей Коминек,
Да, вы правы, что вам нужно одно ограничение, чтобы проверить правильность количества флажков. Однако я не думаю, что все голоса против этого упущения ...
ХансЛиндгрен,
Это часто посещаемый вопрос (посмотрите на положительные отзывы некоторых других ответов!), И вы пришли спустя годы и добавили ответ, который сводится к быстрому кодированию, широко применяемой методике, которая даже не имеет несколько конкретных свойств, которые вы ему приписываете. Я не считаю правильным голосовать за вас ниже 0, но я тоже не удивлен, что это произошло.
Джей Коминек,