La respuesta a su pregunta es lógica, no física: el valor que busca puede cambiar por razones comerciales. Por ejemplo, si indexa a sus clientes por dirección de correo electrónico, ¿qué sucede cuando cambia una dirección de correo electrónico? Obviamente, esto no se aplicará a todas sus tablas de búsqueda, pero los beneficios de hacerlo de la misma manera en toda la aplicación es que simplifica su código. Si todo es entero → relaciones enteras internamente, está cubierto.
Simplemente lea su comentario a Sandy; quizás en este caso lo que realmente desea es una restricción de verificación , no una tabla de búsqueda / clave externa, por ejemplo:
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
Ejecute esto y obtendrá:
(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.
Este es un método eficiente y de alto rendimiento, pero la desventaja, por supuesto, es que agregar un nuevo sabor significa un cambio de código. Aconsejaría no hacerlo en la aplicación, porque entonces debe hacerlo en todas las aplicaciones que se conectan a esta base de datos, este es el diseño más limpio posible porque solo hay una ruta de código única para hacer la validación.