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

Mar*_*rko 127 sql database-design

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

到目前为止,我想到了3个场景

  1. INT - 在代码与枚举对齐(1 =男,2 =女性,3 = ...)
  2. char(1) - 存储m,f或其他单个字符标识符
  3. (布尔值) - 此选项是否有适当的字段名称?

我想问的原因是因为这个的答案,其提到字符布尔值.

我要澄清,我使用MS SQL 2008,它DOES其实有位数据类型.

Pon*_*ife 172

已有ISO标准; 无需发明自己的方案:

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

根据标准,列应该被称为"Sex",而"最接近"的数据类型将是tinyint,具有CHECK约束或查找表.

  • 这是为了性.OP特别要求性别.性和性别可能具有可能需要捕获的不同可能值. (4认同)
  • 为什么它会因为"不适用"而跳到9?3-8怎么样? (3认同)
  • @indigochild OP 在问题标题中使用了这两个词,并且清楚地认为它们是等效的,至少*对于他的用例*(YMMV)。我的观点很简单,该领域存在 ISO 标准,当存在官方标准时,您永远不应该浪费时间设计自己的方案。当然,除非该标准不涵盖您的特定情况,否则这是完全可能的。 (3认同)
  • 这绝对应该是答案。@PeterCordes 这个 ISO 用于性别(生物性别)而不是性别(您所识别的性别) - [此处解释](https://en.wikipedia.org/wiki/Sex_and_gender_distinction)。我想在想要存储性别的情况下(我不知道你有什么用途这样做),只要你想存储少于 255 个性别(通过说 fe 0 = 未知/不想声明,1 = 男性,2 = 女性,3 = 男性自认为女性等) (2认同)

OMG*_*ies 77

我将这个专栏称为"性别".

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
Run Code Online (Sandbox Code Playgroud)

BIT数据类型可以排除,因为它仅支持两种可能的性别是不够的.虽然INT支持两个以上的选项,但需要4个字节 - 使用更小/更窄的数据类型时性能会更好.

CHAR(1)优于TinyINT - 两者都采用相同的字节数,但CHAR提供的数值更为狭窄.使用CHAR(1)"m","f"等自然键,使用数字数据(称为代理/人工键). CHAR(1)任何数据库也支持,如果需要端口.

结论

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

附录

在性别列的索引很可能将不会帮助,因为有一个在一个低基数列的索引没有价值.意思是,索引的值没有足够的多样性来提供任何值.

  • @Marko:就像我之前说过的那样,他们是平等的.但索引很可能不会帮助,因为低基数列的索引中没有值.意思是,索引的值没有足够的多样性来提供任何值. (4认同)

use*_*421 43

医学上有四种性别:男性,女性,不确定和未知.您可能不需要全部四个,但您肯定需要1,2和4.这种数据类型的默认值是不合适的.甚至更少将它视为具有'is'和'is not'状态的布尔值.

  • [英国国家健康服务(NHS)数据字典](http://www.datadictionary.nhs.uk/data_dictionary/attributes/p/person/person_gender_code_de.asp?shownav=1)定义了四个值:0 ="未知" ,1 ="男性",2 ="女性",9 ="未指定",反映[ISO 5218](http://en.wikipedia.org/wiki/ISO_5218)值.注意有[两种类型](http://www.datadictionary.nhs.uk/data_dictionary/attributes/p/person/person_gender_type_de.asp?query=gender&rank=75&shownav=1):注册时的性别(通常在出生后不久)和当前. (15认同)
  • 我的父亲,MD BS FRACP. (11认同)