データベースへのセックス(性別)の保存


130

ユーザーの性別をできるだけ少ない(サイズ/パフォーマンス)コストでデータベースに保存したい。

これまでに3つのシナリオが思い浮かびます

  1. INT - (1 =男性、2 =雌、3 = ...)コードで列挙と整列
  2. CHAR(1) - ストアMFまたは別の単一の文字識別子
  3. ビット (ブール) - このオプションに適切なフィールド名はありますか?

私が尋ねる理由は、charsboolean より小さいというこの回答のためです。

私はMS SQL 2008を使用していることを明確にする必要があります。MSSQL 2008 は実際にはビットデータ型です。


1
FWIW、あなたが参照したそのSOの質問は、.NETがこれらの型をメモリ内でどのように表現するかについて言及しています。SQL Serverがそれらを表す方法とは何の関係もありません。ビット<=文字。 msdn.microsoft.com/en-us/library/ms177603.aspx
Matt

1
性別フィールドは何に使用していますか?ひもだけでいいので、好きなものを入力できますか?この質問に対するすべての可能な回答を列挙しようとするのは難しいでしょう。
18年

@ThePassenger:通常のオプションは基本的にm / f / otherだと思うので、はい、あなたが提案するような3値は問題ありません。「その他」と「未指定」を区別する必要がある場合があります(「わからない」、「ユーザーにまだ質問していない」など)。毎日設定できるスライダー付きの浮動小数点値を必要とする、性別を問わず流動的な人々には気づいていません。私の推測では、それらのほとんど(および他の伝統的性別のない人々)は、ほとんどすべてのWebサイトで「その他」または「指定されていない」だけを選択して喜んでいると思います。しかし、「性別」ではなく「性別」を求めるのは良い考えではないと思います。
Peter Cordes

1
@PeterCordes私は「ジェンダーフルイド」にあまり気づいていません。私の村では、男性、女性、または牛のどちらかです。今やジャンルが流動的であるとしたら、コンピューターの音のように価値の尺度を作成することは、少し多すぎるように思えます。私の国ではどちらかというとセックスを求めていますが、それほど複雑ではありません。ああ、今のところ私たちが石器時代にいるとは思わないでください!私たちはすでに神を発見しており、最後の植民地化以来、大部分は一神教です。
モニカの革命

2
@PeterCordes:現在の政治情勢でこのようなことを要求すると、他のユーザーよりも優位に立つことができるため、浮動小数点値のスライダーを含めるとすぐに、多次元のスライダーを要求する人が現れます。「スライダーを1つだけ?石器時代ですか?」
vsz

回答:


82

私はこのコラムを「ジェンダー」と呼んでいます。

Data Type   Bytes Taken          Number/Range of Values
------------------------------------------------
TinyINT     1                    255 (zero to 255)
INT         4            -       2,147,483,648 to 2,147,483,647
BIT         1 (2 if 9+ columns)  2 (0 and 1)
CHAR(1)     1                    26 if case insensitive, 52 otherwise

BITのそれだけでは不十分である二つの可能性別をサポートしているため、データ型は除外することができます。一方でINTが二つ以上のオプションをサポートし、それが4つのバイトを取る-パフォーマンスが小さい/より狭いデータ型と良いでしょう。

CHAR(1)TinyINTよりも優れています -どちらも同じバイト数を取りますが、CHARはより狭い数の値を提供します。を使用CHAR(1)すると、「m」、「f」などの自然キーが使用されますが、代理/人工キーと呼ばれる数値データが使用されます。 CHAR(1)移植する必要がある場合は、どのデータベースでもサポートされます。

結論

オプション2:CHAR(1)を使用します。

補遺

カーディナリティの低い列のインデックスには値がないため、性別列のインデックスはおそらく役に立たないでしょう。つまり、インデックスの値には、値を提供するための十分な多様性がありません。


パフォーマンスへの言及?私がやるべきではないことはほとんど微妙に最適化されていることは知っていますが、それは私の好奇心のための食べ物です。
マルコ

@OMGポニーに感謝します。パフォーマンスはどうですか?この場合、charは少しよりコストがかかりますか?
マルコ

4
@Marko:前に言ったように、彼らは同じです。ただし、カーディナリティの低い列のインデックスには値がないため、インデックスはおそらく役に立ちません。つまり、インデックスの値には、値を提供するための十分な多様性がありません。
OMGポニー2010年

1
どのくらいのより良い性能がされ、実際に 64ビットプラットフォーム上で、たとえば、4バイトのデータ型を使用してするつもり?ただ言って... ;-)
クレイグ

1
性別は2つしかないので、少し固執します。ただし、OPの最初の質問は残ります。列名はどうなるでしょうか。「IsMale」または「Is Female」は少し奇妙です...
マテウスフェリペ

180

このためのISO規格はすでにあります。独自のスキームを発明する必要はありません:

http://en.wikipedia.org/wiki/ISO_5218

標準に従って、列は "Sex"と呼ばれる必要があり、「最も近い」データ型は、必要に応じてCHECK制約またはルックアップテーブルでtinyintになります。


4
「該当なし」で9にスキップするのはなぜですか?3-8はどうですか?
Kenmore

4
これはセックス用です。OPは特に性別を尋ねました。性別と性別は、キャプチャする必要がある可能性のある異なる可能性のある値を持っている可能性があります。
インディゴチャイルド

2
@indigochild OPは、質問のタイトルに両方の単語を使用し、少なくとも彼のユースケース(YMMV)でそれらが同等であると明確に見なします。私の要点は、ISO規格がこの分野に存在するということです。公式規格が存在する場合、独自のスキームを考案するために時間を浪費してはいけません。もちろん、その標準があなたの特定のケースをカバーしない限り、それは完全に可能です。
ポンドライフ、2015年

1
これは受け入れられる答えになるはずです。これは、最適化(状況による)ではなく、データの整合性(これは〜永遠に続く)に焦点を当てています。
Paul Cantrell

1
これは間違いなく答えになるはずです。@PeterCordesこのISOは、性別(生物学的性別)に使用され、性別(あなたが何であるかを特定するもの)ではありません- 説明はこちら。性別を保存したい場合(これを行っている用途はわかりません)、255未満の性別を保存したい限り、小さなintで十分です(fe 0と言って)。 =不明/宣言を望まない、1 =男性、2 =女性、3 =男性は女性として識別など)
SolidTerre

43

医学には、男性、女性、不確定、不明の4つの性別があります。4つすべては必要ないかもしれませんが、1、2、および4は確かに必要です。このデータ型のデフォルト値を設定することは適切ではありません。「is」状態と「is n't」状態を備えたブール値としてそれを扱うのはさらに少ない。


1
@EJP、面白い。これへの言及はありますか?
マルコ

11
私の父、MD BS FRACP。
ローン侯爵、

この情報に基づいて、私はTinyInt列挙型(Hugoが示唆するように)に合わせて、少なくとも1、2、および3(その他)に合わせます。
IAbstract 2010年

1
@EJP、あなたの答えはおそらく正しいですが、それは私がどのデータ型を使用するべきかではなく、(技術的に)正しい性別を示しています。
マルコ

17
UK National Health Service(NHS)データディクショナリは、4つの値を定義します。0= Not Known、1 = Male、2 = Female、9 = Not Specifiedで、ISO 5218の値を反映しています。登録時の性別(通常は出産直後)と現在の性別の2種類があることに注意してください。
1

3

Int(またはTinyIntに整列)Enumフィールドには、私の方法論になります。

まず、bitデータベースに単一のフィールドがある場合でも、行は1バイトを使用しbitます。スペースを節約する限り、複数のフィールドがある場合にのみ効果があります。

第二に、文字列/文字は、設計時にどのように見えるかに関わらず、「魔法の値」を感じさせます。言うまでもなく、それは人々が必ずしも明白なものにマッピングする必要のないほぼすべての値を保存できるようにします。

第3に、参照整合性を適用するために、数値はルックアップテーブルを作成するのがはるかに簡単(かつ優れた方法)であり、1対1を列挙型と関連付けることができるため、メモリ内の値の格納にパリティがあります。アプリケーションまたはデータベース内。


2

名前、声、会話から性別を推測し、性別がわからない場合があるので、文字「f」、「m」、「u」を使用します。最終的な決定は彼らの意見です。

それは本当にあなたがその人をどれだけよく知っているか、そしてあなたの基準が身体的な形なのか個人的なアイデンティティなのかによって異なります。心理学者は追加のオプションを必要とするかもしれません-女性とのクロス、男性とのクロス、女性とのトランス、男性とのトランス、両性具有、未定。単一の文字では明確に定義されていない9つのオプションがあるので、私はHugoの小さな整数のアドバイスを使うかもしれません。


話題ではありません。それは答えではありません。
HOD

1

オプション3が最善の策ですが、すべてのDBエンジンに「ビット」タイプがあるわけではありません。少しでもない場合は、TinyINTが最適です。


-5
CREATE TABLE Admission (
    Rno INT PRIMARY KEY AUTO_INCREMENT,
    Name VARCHAR(25) NOT NULL,
    Gender ENUM('M','F'),
    Boolean_Valu boolean,
    Dob Date,
    Fees numeric(7,2) NOT NULL
);




insert into Admission (Name,Gender,Boolean_Valu,Dob,Fees)values('Raj','M',true,'1990-07-12',50000);
insert into Admission (Name,Gender,Boolean_Valu,Dob,Fees)values('Rani','F',false,'1994-05-10',15000);
select * from admission;

ここにリンクの説明を入力


-5

オプション3を使用しますが、1つではなく複数のNON NULLABLEビット列を使用します。IsMale(1 =はい/ 0 =いいえ)Is Female(1 =はい/ 0 =いいえ)

必要な場合:IsUnknownGender(1 = Yes / 0 = No)など...

これにより、定義の読み取り、拡張性、プログラミングが容易になり、ドメイン外の値を使用する可能性がなくなり、値をロックするために2番目のルックアップテーブル+ FKまたはCHECK制約が不要になります。

編集:修正、設定されたフラグが有効であることを確認するには、少なくとも1つの制約が必要です。


なぜ私の回答が反対票を投じられるのか聞いていただければ幸いです。
HansLindgren

制約がなければ、すべての列が1になること、またはすべての列が0になることを妨げるものは何もありません。
Jay Kominek

はい、正しい数のフラグが「チェックされている」ことをチェックするために1つの制約が必要であることは正しいです。しかし、私はすべての
反対

これは頻繁に訪問される質問であり(他のいくつかの回答の賛成票を見てください!)、あなたは数年後にやって来て、ワンホットエンコーディングに相当する回答を追加しました。あなたがそれに帰属するいくつかの具体的なプロパティ。0未満で投票したのは正しかったとは思いませんが、それが起こったのも当然です。
Jay Kominek
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.