web-dev-qa-db-ja.com

性別(性別)をデータベースに保存する

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

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

  1. Int-コード内のEnumと位置合わせ(1 =男性、2 =女性、3 = ...)
  2. char(1)-Storemfまたは別の単一文字識別子
  3. Bit(boolean)-これに適切なフィールド名がありますオプション?

私が尋ねる理由は、このためです answercharsより小さいbooleansより。

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

126
Marko

列を「性別」と呼びます。

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 データ型は、不適切な性別を2つしかサポートしていないため、除外できます。 INT は3つ以上のオプションをサポートしますが、4バイトかかります-小さい/狭いデータ型でパフォーマンスが向上します。

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

結論

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

補遺

性別の列のインデックスは、notに役立つ可能性があります。カーディナリティ列。つまり、インデックスの値には、値を提供するのに十分な多様性がありません。

74
OMG Ponies

これにはすでにISO標準があります。独自のスキームを発明する必要はありません:

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

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

167
Pondlife

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

40
user207421

名前、声、会話から性別を推測し、時には性別を知らないことがあるため、char 'f'、 'm'、および 'u'を使用します。最終決定は彼らの意見です。

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

3
zarac

Intフィールドに揃えられたTinyInt(またはEnum)は私の方法です。

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

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

第三に、参照整合性を強化するために、ルックアップテーブルを作成するのが数値の方がはるかに簡単(およびより良い方法)であり、1対1を列挙型と相関させることができるため、値をメモリに格納する際にパリティがありますアプリケーションまたはデータベース内。

3
Hugo

オプション3が最善の策ですが、すべてのDBエンジンに「ビット」タイプがあるわけではありません。あなたが少しを持っていないなら、TinyINTがあなたの最善の策でしょう。

1
ajacian81