我有性别列
gender
使用MS SQL Server 2012
目前它是smallint,它是2字节-2 ^ 15(-32,768)到2 ^ 15-1(32,767)
并且工作如下
1 = male
0 = female
-1 = not specified
我们在这类字段上做了很多查询。我遇到的问题是
所以我想知道别人怎么做这个
我可以做一个1字节的char(1)
m = male
f = female
x = not specified
这是否会导致where或join子句出现任何性能问题。
答案 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
缺少或未知数据。没有提供数据。而且,更重要的是,当你需要扩展价值领域时,如下所示:
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
类型,可以从字符串强制转换(从字符串显式转换)和静态常量作为可能的枚举值。