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

我想把用户的性别存储在一个数据库中,尽可能地降低(大小/性能)成本。

到目前为止,我想到了三种情况

  1. Int -< em > 与代码中的 Enum 对齐(1 = 雄性,2 = 雌性,3 = ...)
  2. Char (1) -< em > 存储 F或其他单个字符标识符
  3. Bit (布尔值)-< em > 这个选项有合适的字段名吗?

我问这个问题的原因是因为这个 回答提到了 查尔斯更小而不是 布尔型

我应该澄清,我使用的是 MSSQL2008,其中 是的实际上有位数据类型。

157133 次浏览

选项3是您的最佳选择,但并非所有 DB 引擎都具有“位”类型。如果你没有一点,那么 TinyINT 将是你最好的选择。

我会称这个专栏为“性别”。

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

可以排除 比特数据类型,因为它只支持两种可能的性别,这是不够的。虽然 内景支持两种以上的选项,但是它占用4个字节——使用更小/更窄的数据类型可以提高性能。

CHAR(1)TinyINT有优势——两者占用的字节数相同,但 CHAR 提供的值数更少。使用 CHAR(1)将使用“ m”、“ f”等自然键,而不是使用称为代理/人工键的数值数据。如果需要移植,任何数据库都支持 CHAR(1)

结论

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

附录

性别列上的索引可能会有所帮助,因为低基数列上的索引没有值。也就是说,索引的值没有足够的多样性来提供任何值。

医学上有四种性别: 男性、女性、不确定性和未知性。您可能不需要全部4个,但是您肯定需要1、2和4个。为此数据类型设置默认值是不合适的。更不用说把它当作一个带有“ is”和“ isn’t”状态的布尔值了。

Enum字段对齐的 Int(或 TinyInt)将是我的方法。

首先,如果数据库中只有一个 bit字段,那么该行仍将使用一个完整的字节,因此只有在有多个 bit字段的情况下才能节省空间。

其次,字符串/字符对它们来说有一种“神奇的价值”,不管它们在设计时看起来有多么明显。更不用说,它可以让人们存储几乎任何价值,他们不一定映射到任何明显的东西。

第三,数值更容易(也是更好的做法)创建一个查找表,以强制执行参照完整性,并且可以将1比1与一个枚举关联起来,因此在应用程序或数据库的内存中存储数值是奇偶的。

这方面已经有了 ISO 标准,不需要自己发明方案:

Http://en.wikipedia.org/wiki/iso_5218

根据标准,列应该被称为“ Sex”,“最接近”的数据类型应该是 tinyint,适当的话可以使用 CHECK 约束或查找表。

我使用 char‘ f’,‘ m’和‘ u’是因为我通过名字、声音和对话来推测性别,有时候我不知道性别。最终的决定是他们的意见。

这实际上取决于你有多了解这个人,以及你的标准是身体形态还是个人身份。一个心理学家可能需要额外的选择-交叉到女性,交叉到男性,变性到女性,变性到男性,两性人和未决定。如果有9个选项,而不是由一个字符清晰地定义,我可能会采用 Hugo 关于小整数的建议。

我会选择选项3,但是多个非 NULLABLE 位列而不是一个。 男性(1 = 是/0 = 否) 是女性(1 = 是/0 = 否)

如有需要: 未知性别(1 = 是/0 = 否) 诸如此类。

这使得定义易于阅读,易于扩展,易于编程,不可能在域外使用值,也不需要第二个查找表 + FK 或 CHECK 约束来锁定值。

编辑: 更正,您确实需要至少一个约束来确保设置标志是有效的。

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;

在这里输入链接描述