2012-02-11 4 views
1

外部キーを数値IDにする必要がありますか他の値を使用できますか?私は現在idsを使用していますが、妥当性検査、挿入などの前にidsに値を変換するためにテーブルに加わったり継承したりしなければなりません(入力を除いて、私のコードでidsの代わりに値を参照します)。例えば、statusテーブル - 数値IDをなくし、値(「アクティブ」、「一時停止」など)を保持することはできますか?MySQLの外部キーはIDまたは値を使用しますか?

これは、主にリソース/多少静的なテーブルで使用されます。

ボーナスに関する質問:私は結合テーブルにidフィールドが必要ですか?私は彼らの目的を見ることができません。

可能ですか?欠点?提案?

答えて

2

外部キーは他の種類の列も参照できます。

enum効率的に使用したい文字列がいくつかある場合は、これをお勧めします。内部的に整数になりますが、代わりに名前を使用できます。 mysql reference

2

charまたは他の種類の列が外部キーとして使用できます。問題は、列が広くなることです。 256種類のステータスを格納するのに十分な数のTINYINTは、1バイト必要です。 A CHAR(10)'Active''Suspended'などを保存できるので、10バイト必要です。行だけでなく、索引も広くなります。現代のハードディスクではスペースは問題ではないかもしれませんが、インデックスサイズは効率にも影響します。

したがって、パフォーマンス低下を許容できる場合は、数値IDを削除して値を保持するだけで済みます。

また、あなたはstatusテーブルの主キーとしてCHAR(1)を使用することができます(とオフコース、他のテーブルの外部キーのように)、あなたはそれが動作するなど、'Suspended'ため'S''Active'ため、'A'を持つことができるならば、あなたドン26種類以上のステータスがあります。

MySQLのENUMタイプは、ここではビルKarwinによって答えに記載されているいくつかの問題が、あります。一人でパフォーマンス上の理由からMysql ENUM type vs join tables

+0

を、私は今までFKSのためのint型を使用していました。 –

+0

@MikePurcell:だから、あなたは自然なキーを好むと思いますよね?私も。 –

+0

確かに。偉大な心は似ていると思う。 –