我想知道为什么我应该使用int作为查找表的主键,而不是仅将查找值用作主键(在大多数情况下是字符串)。如果将nvarchar(50)链接到具有很多记录的表,则使用invarchar(50)会占用更多空间。

另一方面,直接使用lookup值基本上可以节省我们进行连接的时间。我可以想象,如果始终需要加入,这将节省很多钱(我们正在开发一个Web应用程序,因此这很重要)。

使用int主键的优点是什么? (特别是用于查找表)不是“标准操作”?

评论

您可以在前面的两个问题中找到很好的信息,甚至找到所需的答案:包含表中所有列的主键有什么好处?和Character vs Integer主键。

#1 楼

您的问题的答案是合乎逻辑的,而不是物理上的-由于业务原因,您查找的值可能会更改。例如,如果您通过电子邮件地址为客户建立索引,那么当电子邮件地址更改时会发生什么?显然,这并不适用于您的所有查找表,但是在整个应用程序中以相同的方式进行操作的好处在于,它使您的代码更简单。如果内部所有内容都是整数→整数关系,则可以满足要求。

只需阅读您对Sandy的评论-也许在这种情况下,您真正​​想要的是检查约束,而不是外键/查找表,例如:

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.


这是一种高效,高性能的方法,但是缺点是添加新的风味手段代码更改。我建议不要在应用程序中执行此操作-因为然后您需要在连接到该数据库的每个应用程序中执行此操作,因此这是最干净的设计,因为只有一条代码路径可以进行验证。

评论


@ Gaius-很好的例子...对于这种类型的场景,我不想使用“检查约束”。它无法维护的主要原因(您已经指出它是不利的)。

– CoderHawk
2011-3-26在10:28



@Sandy它实际上取决于数据,更改频率和在其他地方使用。例如,如果约束必须由数据库强制执行,但是这些值也可以用于填充下拉菜单或报表中,那么外键会更合适。无论哪种方式,我都建议不要在应用程序中这样做。

– Gaius
2011年3月26日上午10:33

#2 楼

“直接使用查找值” –它与查找表的实际目的有点矛盾。为什么要保留这样一张桌子?如果不是查找的话。
我可能误会了你的问题。这是来自msdn的查找表定义


查找表用于基于
中的外键字段的值来显示一个表中的信息。
另一张桌子。例如,考虑销售数据库中的一个
订单表。
订单表中的每个记录
都包含一个CustomerID,该ID指示哪个客户下了订单。
客户ID是指向客户
表中客户记录的外键
。在显示
订单列表(从“订单”表中)时,您可能
要显示实际客户名称,而不是CustomerID。
由于客户名称位于
客户表,您正在
显示订单表中的数据,
您需要创建一个查找表,

订单中获取CustomerID值记录,并使用该值
导航关系,并返回更易读的客户名称。这个概念称为
查找表。


您可以否忽略查找表的用途?是否用于存储如下所示的静态数据,并且这些记录不是其他表记录的输入?

调味品表

Orange  
Pista  
Mango


如果以上是您的情况,那么我建议您不要使用查找表;可能在您的Web应用程序中将这些列表值硬编码。这样,您可以避免不必要的数据库查询。

评论


好的一点,我的查找表的目的基本上只是通过外键约束来强制执行列可以具有的不同值。我同意将其硬编码到应用程序中可能是处理此问题的另一种方法。

–Jaco Briers
2011-3-25在16:23



@Jaco Briers-参见Gaius答案...使用Check Constraint ...

– CoderHawk
2011年3月26日在8:46

#3 楼

由于您使用“专门用于查找表”来限定问题的范围,因此答案可能会简化为“节省空间”。

我认为,如果您删除该限定词,您的问题将变成“为什么要使用替代键而不是自然键?”我写了以下文章来支持代理键:

”“迁移一个整数值而不是一个更宽的复合键具有许多好处。它提供了整个物理模型的良好一致性,并且大大节省了空间。与迁移复合键相比,它可以节省成本并减少I / O,尤其是在规范化的模型中。此外,它们还简化了对模型和查询联接的理解。“标准要做的事情。”不幸的副产品是人们扔了一个替代钥匙,却不认为候选钥匙是什么...但是现在我们已经超出了您的问题:)

#4 楼

我经常使用的原因之一是,如果有人在查询表中拼错了一个值,例如说Oraneg而不是Orange,则更改查询表中的值非常容易。

具有数字主键的查找表仅需要在查找表中更改值。

使用值作为主键的查找表将需要在查找表以及使用它的主表中的每个记录中进行更改。

#5 楼

定义ID时,还可以保证唯一性。但是,当您将电子邮件作为唯一标识符时,会将唯一性责任转移到不受信任的第三面。