将性(性别)存储在数据库中

我想用尽可能less的(大小/性能)成本将用户性别存储在数据库中。

到目前为止,有三种情况出现

  1. 与代码中的Enumalignment(1 =男,2 =女,3 =希望不需要这个)?
  2. char(1)存储mf
  3. (布尔)并调用列isMale(抱歉女士:P)?

没有与选项3打交道的性别歧视行为 🙂

我问的原因是因为这个答案提到字符 比布尔值

编辑
我应该澄清,我正在使用MS SQL 2008,它实际上有位数据types。

编辑#2
围绕2个以上性别的几个有趣的答案,并使用isMale列。 我希望我不会因为写这个而被标记,但是在我们现在的(现代)社会中,我猜布尔(性别)列的最合适的名字是hasPenis

编辑#3
原来这个问题是相当主观的,因为人们在下面的答案中提出了所有3个选项。 我会让社区注意他们认为是最好的解决scheme,因为我不知道接受哪个答案。

编辑#4
我开始倾向于@OMG小马的回答 ,主要是因为他有更高的代表和sql-server标签的金徽章 – 看起来他知道他在说什么。
来吧人, 投票 ! 🙂

我会打电话给“性别”一栏。

 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数据types,因为它不能支持它们。 虽然INT支持两个以上的选项,但需要4个字节 – 对于更小/更窄的数据types,性能会更好。

CHAR(1)在TinyINT上具有边缘 – 两者都采用相同的字节数,但CHAR提供了更窄的数值。 使用CHAR(1)将使用“m”,“f”等自然键与使用被称为替代/人造键的数字数据。 CHAR(1)也支持任何数据库,如果需要移植的话。

结论

我会使用选项2:CHAR(1)。

附录

性别列上的索引可能无济于事,因为低基数列中的索引中没有值。 意思是,索引的值没有足够的多样性来提供任何值。

目前已经有一个ISO标准。 不需要发明自己的scheme:

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

根据标准,该列应该被称为“性别”,并且“最接近的”数据types将是适当的CHECK约束或查找表tinyint。

在医学上有四种性别:男性,女性,不确定性和未知。 你可能不需要全部四个,但是你肯定需要1,2和4.这个数据types的默认值是不合适的。 更不要把它看作是一个布尔型的“是”和“不是”状态。

我用字母'f','m'和'u',因为我从名字,声音和谈话中猜测性别,有时不知道性别。 最终的决定是他们的意见。

这取决于你是否了解这个人,以及你的标准是身体forms还是个人身份。 心理学家可能需要更多的select – 跨越女性,跨越男性,跨性别女性,跨性别男性,雌雄同体,犹豫不决。 有9个选项,没有明确定义的单个字符,我可以去雨果的小整数的build议。

选项3是你最好的select,但并不是所有的数据库引擎都是“比特”types的。 如果你没有一点,那么TinyINT将是你最好的select。

一个Int (或TinyInt )alignment到一个Enum字段将是我的方法。

首先,如果你在数据库中有一个单独的bit域,那么这行仍然会使用一个完整的字节,所以只要节省了空间,只要你有多个bit域就可以得到回报。

其次,string/字符对他们来说具有“魔术价值”的感觉,无论他们在devise时看起来多么明显。 更何况,它让人们存储任何价值,他们不一定会映射到任何明显的东西。

第三,为了强制引用完整性,一个数值比创build一个查找表容易得多(而且更好的做法),并且可以将1对1与一个枚举相关联,所以在存储器应用程序或数据库中。

我会select3,但多个NON NULLABLE位列而不是一个。 IsMale(1 =是/ 0 =否)是女性(1 =是/ 0 =否)

如果需要:IsUnknownGender(1 =是/ 0 =否)等等…

这使得定义的易读性,易扩展性,易于编程性,在域之外使用值的可能性以及不需要第二查找表+ FK或CHECK约束来locking值。

编写MySQL语句,使用以下命令创build一个名为ADMISSION的表。 列列名types长度学生的姓名Sname字符25性别男布尔

出生dateDobdate

费用支付费用十进制

在这里输入图像说明

 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; 

在这里input链接描述