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



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



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





  1. Int -выравнивается с перечислением в коде (1 = Мужчина, 2 = Женщина, 3 = ...)


  2. char (1) -магазине m,f или другой односимвольный идентификатор


  3. немного(логический) - есть ли подходящее имя поля для этой опции?


Почему я спрашиваю из-за этого ответ в котором упоминается, что chars are меньше чем логические.



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

2249   8  

8 ответов:

Я бы назвал графу "пол".

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

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

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

вывод

Я бы использовал Вариант 2: CHAR(1).

дополнительное соглашение

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

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

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

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

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

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

An Int (или TinyInt) в соответствии с Enum поле будет моей методике.

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

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

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

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

Я бы пошел с вариантом 3, но несколько не ОБНУЛЯЕМЫХ битовых столбцов вместо одного. IsMale (1=Да / 0=Нет) IsFemale (1=Да / 0=Нет)

Если requried: IsUnknownGender (1=Да / 0=Нет) и так далее...

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

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;

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

Comments

    Ничего не найдено.