我希望以最少的(大小/性能)代价将用户的性别存储在数据库中。
目前,我想到了三种情况:
- Int - 与代码中的Enum相对应(1= 男性,2 = 女性,3 = ...)
- char(1) - 存储m,f或其他单个字符标识符
- Bit (布尔值) - 是否有适用于此选项的字段名称?
我之所以这样问是因为该回答提到字符(chars)比布尔值(booleans)更小。
我应该澄清一下,我正在使用MS SQL 2008,它确实具有位(datatype)数据类型。
我希望以最少的(大小/性能)代价将用户的性别存储在数据库中。
目前,我想到了三种情况:
我之所以这样问是因为该回答提到字符(chars)比布尔值(booleans)更小。
我应该澄清一下,我正在使用MS SQL 2008,它确实具有位(datatype)数据类型。
已经有一个ISO标准了,不需要发明自己的方案:
http://en.wikipedia.org/wiki/ISO_5218
根据该标准,列名应称为“性别”,最接近的数据类型应为tinyint,具体应根据需要使用CHECK约束或查找表。
我会把这一列叫做“性别”。
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)。
对于低基数列的索引,对性别列建立索引很可能没有作用。这意味着,该索引的值变化太少,无法为查询提供帮助。
TinyInt
(正如Hugo所建议的),并选择至少1、2和3(其他)。 - IAbstract我的方法是将 Int
(或TinyInt
)与 Enum
字段对齐。
首先,如果你在数据库中有一个单一的 bit
字段,那么该行仍将使用一个完整的字节,因此就空间而言,只有当你有多个 bit
字段时才会节省空间。
其次,字符串/字符给人一种“神奇的价值”感觉,无论它们在设计时看起来多么明显。更不用说,它让人们存储几乎任何他们不一定要映射到任何明显东西的值。
第三,数值更容易(也是更好的实践)为其创建一个查找表,以强制执行引用完整性,并且可以与枚举相关联,因此在应用程序或数据库中存储该值时内存中的存储方式是相同的。
选项3是你最好的选择,但并非所有的数据库引擎都有“bit”类型。如果没有bit类型,则TinyINT将是你最好的选择。
我使用字符'f'、'm'和'u',因为我从姓名、声音和对话中推测性别,有时不确定性别。最终的决定是他们的意见。
这实际上取决于你对这个人的了解程度以及你的标准是身体形态还是个人身份。心理学家可能需要额外的选项——跨越到女性、跨越到男性、变性为女性、变性为男性、两性具有生殖器和未确定。有了9个选项,不被单个字符清晰定义,我可能会采用Hugo的建议使用小整数。
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;
我会选择第三个选项,但是使用多个非空位(bit)列而不是一个。 IsMale (1=是 / 0=否) IsFemale (1=是 / 0=否)
如果需要: IsUnknownGender (1=是 / 0=否),等等……
这样做可以方便地阅读定义,易于扩展、易于编程,没有使用域外的值的可能性,也不需要第二个查找表+FK或CHECK约束来锁定值。
编辑:更正,您需要至少一个约束条件来确保设置标志有效。