La risposta alla tua domanda è logica, non fisica: il valore che cerchi potrebbe cambiare per motivi di lavoro. Ad esempio, se indicizzi i tuoi clienti per indirizzo e-mail, cosa succede quando un indirizzo e-mail cambia? Ovviamente questo non si applica a tutte le tue tabelle di ricerca, ma i vantaggi di farlo allo stesso modo nell'intera applicazione sono che semplifica il tuo codice. Se tutto è intero → relazioni intere internamente, sei coperto.
Leggi il tuo commento a Sandy - forse in questo caso quello che vuoi davvero è un vincolo di controllo , non una chiave esterna / tabella di ricerca, ad esempio:
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
Esegui questo e otterrai:
(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.
Si tratta di un metodo efficiente e ad alte prestazioni, ma lo svantaggio ovviamente è che l'aggiunta di un nuovo sapore comporta una modifica del codice. Vorrei sconsigliarmi di farlo nell'applicazione - perché quindi è necessario farlo in ogni app che si collega a questo DB, questo è il design più pulito possibile perché esiste un solo percorso di codice per eseguire la convalida.