我想以尽可能少的(大小/性能)成本将用户的性别存储在数据库中。
到目前为止,我想到了3种情况
- INT - 在代码与枚举对齐(1 =男,2 =女性,3 = ...)
- char(1) - 存储m,f或另一个单个字符标识符
- 位 (布尔值) - 此选项是否有适当的字段名称?
我想问的原因是因为这个的答案,其提到字符是小比布尔值。
我要澄清,我使用MS SQL 2008,它DOES其实有位数据类型。
我想以尽可能少的(大小/性能)成本将用户的性别存储在数据库中。
到目前为止,我想到了3种情况
我想问的原因是因为这个的答案,其提到字符是小比布尔值。
我要澄清,我使用MS SQL 2008,它DOES其实有位数据类型。
Answers:
我称该列为“性别”。
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:CHAR(1)。
在性别列的索引很可能将不会帮助,因为有一个在一个低基数列的索引没有价值。意思是,索引值的多样性不足以提供任何值。
为此已经有一个ISO标准。无需发明自己的方案:
http://en.wikipedia.org/wiki/ISO_5218
按照标准,该列应称为“ Sex”,并且“最接近”的数据类型将是tinyint,并带有适当的CHECK约束或查找表。
在医学上有四种性别:男性,女性,不确定和未知。您可能不需要全部四个,但您确实需要1、2和4。为此数据类型设置默认值是不合适的。更不用说将其视为具有“ is”和“ is n't”状态的布尔值了。
TinyInt
枚举(如Hugo所建议的)对齐,并至少与1、2和3(其他)一起使用。
Not Known
,1 = Male
,2 = Female
,9 = Not Specified
,这与ISO 5218值相同。注意有两种类型:注册时的性别(通常是出生后不久)和当前的性别。
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;
我会选择3,但要使用多个NON NULLABLE位列而不是一个。IsMale(1 =是/ 0 =否)Ismale(1 =是/ 0 =否)
如果需要:IsUnknownGender(1 =是/ 0 =否),依此类推...
这使得易于阅读定义,易于扩展,易于编程,不可能在域外使用值,也不需要第二查找表+ FK或CHECK约束来锁定值。
编辑:更正,您确实需要至少一个约束来确保设置的标志有效。