5

性別の列があります

gender

MS SQL Server 2012 の使用

現在、2 バイト -2^15 (-32,768) から 2^15-1 (32,767) の smallint です。

そして次のように動作します

1 = male
0 = female
-1 = not specified

このタイプのフィールドに対して多くのクエリを実行します。そして私が抱えている問題は

  1. 説明なしにデータが何を意味するかについて直感的ではない
  2. 2バイト使用しています

だから私は他の人がこれをどのように行うのか疑問に思っていました

1バイトのchar(1)を実行できます

m = male
f = female
x = not specified

これにより、where または join 句でパフォーマンスの問題が発生しますか。

4

3 に答える 3

3

一般に、リストを作成するためのはるかに優れた方法は、ドメインまたはルックアップ テーブルを使用することです。

属性が必須の場合は、null 非許容にする必要があります。必須でない場合は、null 許容にする必要があります。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' )

コードの変更は [理論的には] ドメイン テーブルにいくつかの行を挿入することで構成されます。ユーザー インターフェイス コントロール、バリデータなどは、ドメイン テーブルからデータを入力しています (または入力する必要があります)。

于 2013-10-17T23:50:32.670 に答える
0

私たち (EHR ソフトウェア) は、多くの人口統計データを扱う際に簡潔で理解しやすいため、1 バイト文字として保存します。

可能な値は次のようにマッピングされます。

  • U- 不明または未指定
  • M- 男
  • F- 女性
  • NULL- その人は尋ねられていない/記録に価値がない.

私たちにとって重要なのは、彼らが意図的に性別を提供しないことに決めたのか、それとも性別がまだ取得されていないのか (したがってNULLvs U) に注意することです。

考慮事項の 1 つは、これをアプリケーション内のより意味のある構造 ( enum.NET など) としてマッピングすることです。switch数値から直接列挙型をキャストできるのに対し、列挙型を取得するために何らかの方法を使用する必要があるのは、アプリケーション担当者としては少し面倒かもしれません。

もちろん些細な問題ですが、どのように解決されたか知りたい場合はstruct、文字列から強制変換できる型 (文字列からの明示的な変換) と静的定数を使用して可能な列挙値として機能させました。

于 2013-10-17T23:15:11.453 に答える