我想知道为什么我应该使用int作为查找表的主键而不是仅使用查找值作为主键(在大多数情况下它将是一个字符串).
据我所知,使用nvarchar(50)而不是int将使用更多空间,如果它链接到具有许多记录的表.
另一方面,直接使用查找值基本上可以节省我们进行连接.我可以想象,如果总是需要加入,这将是一个很大的节省(我们正在开发一个Web应用程序,所以这非常重要).
使用int主键(特别是查找表)的优点是什么,而不是“标准的事情”?
解决方法
您的问题的答案是合乎逻辑的,而不是物理的 – 您查找的价值可能因商业原因而改变.例如,如果您通过电子邮件地址索引客户,那么当电子邮件地址发生变化时会发生什么?显然,这不适用于所有查找表,但在整个应用程序中以相同方式执行它的好处是它使您的代码更简单.如果内部的一切都是整数→整数关系,那么你就被覆盖了.
只需阅读你对Sandy的评论 – 也许在这种情况下你真正想要的是一个Check Constraint,而不是一个外键/查找表,例如:
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的每个应用程序中执行此操作,这是最干净的设计,因为只有一个代码路径可用于执行验证.