あなたの質問への答えは物理的ではなく論理的です-あなたが調べる値はビジネス上の理由で変わるかもしれません。たとえば、顧客を電子メールアドレスでインデックス付けした場合、電子メールアドレスが変更されるとどうなりますか?明らかにこれはすべてのルックアップテーブルに適用されるわけではありませんが、アプリケーション全体で同じ方法で行う利点は、コードが簡単になることです。すべてが内部的に整数→整数の関係であれば、カバーされます。
Sandyへのコメントを読んでください。おそらくこの場合、本当に必要なのは、外部キー/ルックアップテーブルではなく、チェック制約です。
create table icecream (flavour varchar(10))
go
alter table icecream add constraint ck_flavour check (flavour in ('Orange', 'Pista', 'Mango'))
go
insert into icecream (flavour) values ('Orange')
go
insert into icecream (flavour) values ('Vanilla')
go
これを実行すると、以下が得られます:
(1 row(s) affected)
Msg 547, Level 16, State 0, Line 1
The INSERT statement conflicted with the CHECK constraint "ck_flavour". The conflict occurred in database "GAIUSDB", table "dbo.icecream", column 'flavour'.
The statement has been terminated.
これは効率的で高性能な方法ですが、もちろん、新しいフレーバーを追加するとコードが変更されるという欠点があります。アプリケーションで実行することはお勧めしません。このDBに接続するすべてのアプリケーションで実行する必要があるため、検証を実行するためのコードパスが1つしかないため、これは最もクリーンな設計です。