web-dev-qa-db-ja.com

データベースの外部キー/主キーとしてのVARCHARは良いですか、悪いですか?

外部キーとしてVARCHARSの代わりにID nr:sを使用する方が良いですか?そして、主キーとしてVARCHARSのID nr:s isnteadを使用する方が良いですか? ID nrとは、INTを意味します。

これは私が今持っているものです:

category table:
cat_id ( INT ) (PK)
cat_name (VARCHAR)

category options table:
option_id ( INT ) (PK)
car_id ( INT ) (FK)
option_name ( VARCHAR ) 

私はこれを考えることができた:

category table:
cat_name (VARCHAR) (PK)

category options table:
cat_name ( VARCHAR ) (FK)
option_name ( VARCHAR ) ( PK )

または私はここで完全に間違っていると思いますか?

36
user188962

任意のキーにVARCHARが使用されている場合の問題は、VARCHARがWHITE SPACEを保持できることです。空白は、スペースタブ、キャリッジリターンなど、画面で読み取れない任意の文字で構成されます。VARCHARをキーとして使用すると、テーブルが最後に余分なスペースを含むレコードを返さない理由を突き止めると、生活が困難になる可能性があります。彼らの鍵の。

確かに、あなたは[〜#〜] can [〜#〜] VARCHARを使用しますが、入力と出力には十分注意する必要があります。また、より多くのスペースを必要とし、クエリを実行するときに遅くなる可能性があります。

整数型には、有効な10文字の小さなリスト,1,2,3,4,5,6,7,8,9があります。キーとして使用する方がはるかに優れたソリューションです。

より高速な検索の利点を得たい場合は、常に整数ベースのキーを使用し、VARCHARをUNIQUE値として使用できます。

30
Armstrongest

私がデザイン作業をしているとき、私は自分自身に問いかけます:このデータで、NULLでなく、一意であり、nchangeingであることを保証できる何かを得ましたか?もしそうなら、それは主キーになる候補です。そうでない場合は、使用するキー値を生成する必要があることを知っています。次に、私の候補キーがたまたまVARCHARだとすると、データを調べます。長さはかなり短いですか(つまり、20文字以下)。または、VARCHARフィールドはかなり長いですか?短い場合はキーとして使用できます。長い場合は、キーとして使用しない方がよいでしょう(ただし、主キーであることを考慮している場合は、とにかくインデックスを作成する必要があります)。少なくとも私の懸念の一部は、主キーにインデックスを付ける必要があり、おそらく他のテーブルからの外部キーとして使用されることです。 VARCHARフィールドの比較は、数値フィールド(特に整数などのバイナリ数値フィールド)の比較よりも遅くなる傾向があるため、長いVARCHARフィールドをキーとして使用すると、パフォーマンスが低下する可能性があります。 YMMV。

私の2セント:

パフォーマンスの観点から見ると、CHARまたはVARCHARを主キーまたはインデックスとして使用することは悪夢です。

私は複合主キー(INT + CHAR、INT + VARCHAR、INT + INT)をテストしましたが、INT + INTが最高のパフォーマンスでした(データウェアハウスのロード)。数値の主キー/インデックスのみを保持すると、パフォーマンスが約2倍になります。

12
jrvidotti

カテゴリ名をIDにすると、カテゴリの名前を変更する場合に問題が発生します。

4
SorcyCat

[〜#〜] varchar [〜#〜]PRIMARYと外部キー

私が予見できた唯一の問題は、あなたがテーブルを持っていて、Instruments(シェア楽器)と言って、あなたがを作成することですPRIMARY/FOREIGN KEYas[〜#〜] varchar [〜#〜]、そして[〜#〜]コード[〜#〜]が変更されます。

これは証券取引所で発生し、これへのすべての参照の名前を変更する必要があります[〜#〜]コード[〜#〜]。 ID nrはこれをあなたに要求しません。

だから結論として、これはあなたの使用目的に依存すると思います。

[〜#〜]編集[〜#〜]

私がコードと言うときは、ティッカーコードがGOOGまたはその他の共有を言うことを意味します。これらのコードは時間の経過とともに変化する可能性があります。たとえば、デリバティブ/先物銘柄を見てみましょう。

3
Adriaan Stander

intを使用すると、varcharを使用して4バイトで最大20億を格納できます。varcharを使用する場合、10バイトほど必要とすることはできません。varcharを使用すると、2バイトのオーバーヘッドも発生します。

これで、すべてのPKとFKに6バイトが追加され、2バイトのvarcharオーバーヘッドが追加されます。

3
SQLMenace

どちらのアプローチにも問題はありませんが、この質問は、自然キーまたは代理キーという通常の議論のほうが良いかもしれません。

CHARまたはVARCHARを主キーとして使用する場合、ある時点でそれを外部キーとして使用することになります。 @astanderが言うように、それは、データとそれをどのように使用するかによって異なります。

2
Tony