Die Antwort auf Ihre Frage ist logisch und nicht physisch. Der Wert, den Sie nachschlagen, kann sich aus geschäftlichen Gründen ändern. Was passiert beispielsweise, wenn Sie Ihre Kunden nach E-Mail-Adresse indizieren, wenn sich eine E-Mail-Adresse ändert? Dies gilt natürlich nicht für alle Ihre Nachschlagetabellen, aber der Vorteil der gleichen Vorgehensweise in der gesamten Anwendung besteht darin, dass der Code einfacher wird. Wenn intern alles Integer → Integer-Relationen ist, sind Sie abgesichert.
Lies Sandy einfach deinen Kommentar vor - in diesem Fall ist das, was du wirklich willst, eine Check-Einschränkung , keine Fremdschlüssel- / Nachschlagetabelle, zB:
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
Führen Sie dies aus und Sie erhalten:
(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.
Dies ist eine effiziente und leistungsstarke Methode, aber der Nachteil ist natürlich, dass das Hinzufügen einer neuen Version eine Codeänderung bedeutet. Ich würde davon abraten, dies in der Anwendung zu tun - da Sie dies dann in jeder App tun müssen, die eine Verbindung zu dieser Datenbank herstellt, ist dies das sauberste Design, da es nur einen einzigen Codepfad für die Validierung gibt.