A resposta para sua pergunta é lógica, não física - o valor que você procura pode mudar por razões comerciais. Por exemplo, se você indexa seus clientes por endereço de email, o que acontece quando um endereço de email é alterado? Obviamente, isso não se aplicará a todas as suas tabelas de pesquisa, mas os benefícios de fazê-lo da mesma maneira em todo o aplicativo é que ele simplifica seu código. Se tudo for relações inteiras → inteiras internamente, você estará coberto.
Basta ler seu comentário para Sandy - talvez, neste caso, o que você realmente queira seja uma restrição de verificação , não uma tabela de chave / pesquisa estrangeira, por exemplo:
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
Execute isso e você obtém:
(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.
Esse é um método eficiente e de alto desempenho, mas a desvantagem é que adicionar um novo sabor significa uma alteração no código. Eu desaconselharia fazê-lo no aplicativo - porque você precisa fazê-lo em todos os aplicativos que se conectam a esse banco de dados, esse é o design mais limpo possível, pois existe apenas um único caminho de código para validação.