性别存储和数据类型

时间:2013-10-17 23:01:08

标签: sql sql-server

我有性别列

gender

使用MS SQL Server 2012

目前它是smallint,它是2字节-2 ^ 15(-32,768)到2 ^ 15-1(32,767)

并且工作如下

1 = male
0 = female
-1 = not specified

我们在这类字段上做了很多查询。我遇到的问题是

  1. 如果没有解释,数据意味着什么并不直观
  2. 它使用两个字节
  3. 所以我想知道别人怎么做这个

    我可以做一个1字节的char(1)

    m = male
    f = female
    x = not specified
    

    这是否会导致where或join子句出现任何性能问题。

3 个答案:

答案 0 :(得分:3)

更好的方法,一般来说,做事情就是使用域或查找表。

如果您的属性是必需的,则它应该是不可为空的。如果不是必需的,它应该是可空的。 Null表示数据丢失;用户没有回答这个问题。这是一个不同的价值,而不是“我不知道”或“你的业务没有”的肯定答案。但我离题了。

这样的架构就是你想要的:

create table dbo.person
(
  . . .
  gender_id tinyint null foreign key references dbo.gender(id) ,
  . . .
)

create table dbo.gender
(
  id          tinyint not null primary key clustered    ,
  description varchar(128) not null unique ,
)
insert dbo.gender values( 1 , 'Fale'   )
insert dbo.gender values( 2 , 'Memale' )
insert dbo.gender values( 3 , 'Prefer Not To Say' )

gender_id表中的列person的域由外键约束强制执行,并且

  • null缺少或未知数据。没有提供数据。
  • 1表示此人是女性。
  • 2表示此人是男性。
  • 3表示此人不想向您提供信息。

而且,更重要的是,当你需要扩展价值领域时,如下所示:

insert dbo.gender values( 4 , 'Transgendered, male-to-female, post-gender reassignment surgery' )
insert dbo.gender values( 5 , 'Transgendered, male-to-female, receiving hormone therapy' )
insert dbo.gender values( 6 , 'Transgendered, female-to-male, post-gender reassignment surgery' )
insert dbo.gender values( 7 , 'Transgendered, female-to-male, receiving hormone therapy' )

您的代码更改[理论上]包括在域表中插入几行。用户界面控件,验证器等是(或应该)从域表填充自己。

答案 1 :(得分:2)

你可以随心所欲地做到这一点,但如果你想遵循标准,就有:http://en.wikipedia.org/wiki/ISO_5218

The four codes specified in ISO/IEC 5218 are:
0 = not known,
1 = male,
2 = female,
9 = not applicable.

答案 2 :(得分:0)

我们(EHR软件)存储为1字节字符,因为它在处理大量人口统计数据时简洁易懂。

可能的值映射如下:

  • U - 未知或未说明
  • M - 男
  • F - 女性
  • NULL - 没有人被记录/没有记录值。

对于我们来说,重要的是要注意他们是否故意决定不提供性别,或者它是否尚未被捕获(因此NULL vs U)。

一个考虑因素是将其映射为应用程序中更有意义的结构(例如,.NET中的enum或类似结构)。作为一个应用程序人员,必须使用switch或其他方法来获取枚举,这可能有点烦人,而我可以直接从数值中转换枚举。

当然,这是一个微不足道的问题,但如果你很好奇如何解决它,我们使用了struct类型,可以从字符串强制转换(从字符串显式转换)和静态常量作为可能的枚举值。