5

我有一个性别专栏

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 字节的 char(1)

m = male
f = female
x = not specified

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

4

3 回答 3

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

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

于 2013-10-17T23:50:32.670 回答
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.
于 2013-10-17T23:26:57.647 回答
0

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

可能的值映射如下:

  • U- 未知或未指定
  • M- 男性
  • F- 女性
  • NULL- 没有人被问过/没有记录价值。

对我们来说,重要的是要注意他们是否故意决定不提供他们的性别,或者是否还没有被捕获(因此NULLvs U)。

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

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

于 2013-10-17T23:15:11.453 回答