2013-10-17 40 views
3

我有一个性别柱性别存储和数据类型

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. 它使用两个字节

,所以我不知道别人是怎么做到这一点

我可以做一个1字节字符(1)

m = male 
f = female 
x = not specified 

这会导致任何性能问题w在这里或加入条款。

+0

一般来说,如果你的系统是IO绑定的,那么你的数据类型越小越好。 – Laurence

+2

这取决于许多事情,特别是您的服务器实现,你没有给。找出唯一合理的方法是测试。但如果你看到很大的差异,我会感到惊讶。 – Gene

+3

使用字符。我不喜欢女性等于0,而男性则等于1 ......似乎没有。字符对查看数据的任何人都有意义。不要忘记你也可以使用'null'。 –

回答

1

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

可能的值映射如下:

  • U - 未知或不确定
  • M - 男性
  • F - 女性
  • NULL - 人没有被要求/无记录值。

对于我们来说,一定要注意,如果他们特意决定不提供自己的性别是很重要的,或者如果它尚未捕获(从而NULL VS U)。

一个考虑因素是将其映射为应用程序中更有意义的结构(例如,.NET中的enum或类似)。这可能是一个令人讨厌的应用程序人不得不使用switch或其他方法来获得枚举,而我可以直接从一个数字值枚举枚举。当然,这是一个微不足道的问题,但是如果你很好奇它是如何解决的,我们使用了一个可以从一个字符串(显式转换字符串)和静态常量强制的struct类型作为可能的枚举值。

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

的更好的方法,在一般情况下,做的事情列出这是使用一个域或查找表。

如果您的属性是必需的,它应该是不可空的。如果不是必需的,它应该是可空的。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_idperson表中的域由外键约束强制执行,是

  • 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') 

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