2013-10-17 42 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') 

更改您的代碼[理論]由插入幾行到域表。用戶界面控件,驗證器等等(或應該)自己從域表中填充。