代码之家  ›  专栏  ›  技术社区  ›  Marko

在数据库中存储性别

  •  124
  • Marko  · 技术社区  · 15 年前

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

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

    1. 内景 - 与代码中的枚举对齐(1=男性,2=女性,3=…)
    2. 字符(1) - 商场 , f型 或另一个单字符标识符
    3. 钻头 (布尔值) - 此选项是否有合适的字段名?

    我问的原因是 answer 其中提到 字符 较小的 布尔运算 .

    我应该澄清一下,我使用的是MS SQL 2008,它 实际上有位数据类型。

    8 回复  |  直到 6 年前
        1
  •  79
  •   shogged    7 年前

    我把这个专栏叫做“性别”。

    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提供的值的数目更窄。使用 字符(1) 将使用“m”、“f”等自然键,而不是使用称为代理/人工键的数字数据。 字符(1) 也支持任何数据库,如果需要端口。

    结论

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

    附录

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

        2
  •  172
  •   Pondlife    11 年前

    这已经有一个ISO标准;不需要发明自己的方案:

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

    根据标准,该列应称为“Sex”,并且“closest”数据类型应为tinyint,并根据需要使用CHECK约束或查找表。

        3
  •  43
  •   user207421    15 年前

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

        4
  •  3
  •   Hugo    15 年前

    一个 Int (或 TinyInt )对齐到 Enum 领域将是我的方法论。

    首先,如果你有一个 bit 字段在一个数据库中,该行仍将使用一个完整的字节,因此就节省空间而言,只有当您有多个 一点 领域。

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

    第三,为了强制引用完整性,数字值更容易(而且更好的实践)为创建查找表,并且可以将1对1与枚举关联起来,因此在应用程序或数据库的内存中存储该值时存在奇偶校验。

        5
  •  3
  •   zarac    14 年前

    我使用“f”、“m”和“u”字符是因为我从名字、声音和对话中猜测性别,有时不知道性别。最后的决定是他们的意见。

    这真的取决于你对这个人的了解程度,以及你的标准是身体形态还是个人身份。一个心理学家可能需要额外的选择-交叉到女性,交叉到男性,转换到女性,转换到男性,两性和未决定。有了9个选项,没有一个字符明确定义,我可能会同意雨果关于小整数的建议。

        6
  •  1
  •   ajacian81    15 年前

    选项3是您的最佳选择,但不是所有的数据库引擎都有一个“位”类型。如果你一点也没有,那么TinyINT是你最好的选择。

        7
  •  -5
  •   HansLindgren    10 年前

    我将使用选项3,但多个不可为空的位列而不是一个。 IsMale(1=是/0=否) 是女性(1=是/0=否)

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

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

        8
  •  -5
  •   Jaydip Jadhav    8 年前
    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;
    

    enter link description here