Хранение пола (гендера) в базе данных
Я хочу сохранить пол пользователя в базе данных с как можно меньшей стоимостью (размер/производительность).
до сих пор, 3 сценария приходят на ум
Int -выравнивается с перечислением в коде (1 = Мужчина, 2 = Женщина, 3 = ...)
char (1) -магазине m,f или другой односимвольный идентификатор
немного(логический) - есть ли подходящее имя поля для этой опции?
Почему я спрашиваю из-за этого ответ в котором упоминается, что chars are меньше чем логические.
Я должен уточнить, что я использую MS SQL 2008, который тут на самом деле есть тип данных бит.
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 otherwiseThe немного тип данных может быть исключен, потому что он поддерживает только два возможных пола, что является недостаточным. В то время как 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