我想知道为什么我应该使用一个 int 作为查找表的主键,而不是仅仅使用查找值作为主键(在大多数情况下是一个字符串)。
我知道如果使用 nvarchar(50) 而不是 int 链接到具有许多记录的表,则会使用更多空间。
另一方面,直接使用查找值基本上可以节省我们进行连接的时间。我可以想象如果总是需要加入,这将是一个很大的节省(我们正在开发一个网络应用程序,所以这很重要)。
使用 int 主键(特别是用于查找表)除了它是“标准操作”之外还有什么优势?
我想知道为什么我应该使用一个 int 作为查找表的主键,而不是仅仅使用查找值作为主键(在大多数情况下是一个字符串)。
我知道如果使用 nvarchar(50) 而不是 int 链接到具有许多记录的表,则会使用更多空间。
另一方面,直接使用查找值基本上可以节省我们进行连接的时间。我可以想象如果总是需要加入,这将是一个很大的节省(我们正在开发一个网络应用程序,所以这很重要)。
使用 int 主键(特别是用于查找表)除了它是“标准操作”之外还有什么优势?
您的问题的答案是合乎逻辑的,而不是物理的 - 您查找的值可能会因业务原因而改变。例如,如果您按电子邮件地址索引您的客户,当电子邮件地址更改时会发生什么?显然,这不适用于所有查找表,但在整个应用程序中以相同方式执行此操作的好处是它使您的代码更简单。如果内部一切都是整数→整数关系,那么您就被覆盖了。
只需阅读您对 Sandy 的评论 - 在这种情况下,您真正想要的是Check Constraint,而不是外键/查找表,例如:
运行这个,你会得到:
这是一种高效、高性能的方法,但缺点当然是添加新风格意味着代码更改。我建议不要在应用程序中执行此操作 - 因为您需要在连接到此数据库的每个应用程序中执行此操作,这是最简洁的设计,因为只有一个代码路径用于进行验证。
“直接使用查找值”——这与查找表的实际目的有点矛盾。你为什么要保留这样一张桌子?如果不是查找。
可能是我误解了你的问题。这是来自msdn的查找表定义
您能详细说明查找表的目的吗?它是否用于存储一些静态数据,如下所示,并且这些记录不是其他表记录的输入?
风味 表
如果以上是您的情况,那么我建议不要使用查找表;可能在您的 Web 应用程序中对这些列表值进行硬编码。这样可以避免不必要的数据库查询。
由于您使用“专门针对查找表”来限定您的问题,因此答案可能被简化为“节省空间”。
我认为如果您删除该限定符,您的问题就会变成“为什么使用代理键而不是自然键?” 我写了以下内容来支持代理键:
“迁移一个整数值而不是一个更宽的复合键有很多好处。它在整个物理模型中提供了很好的一致性,与迁移复合键相比,总的来说节省了更多的空间,并减少了 I/O;尤其是在标准化模型。此外,它们简化了对模型和查询连接的理解。
这在很大程度上就是为什么它“成为标准的事情”。不幸的副产品是人们抛出代理键并且不认为候选键是什么......但现在我们已经超出了你的问题:)
我经常使用的原因之一是,如果有人在查找表中拼错了一个值,比如说 Oraneg 而不是 Orange,那么更改查找表中的值非常容易。
具有数字主键的查找表只需要更改查找表中的值。
使用这些值作为主键的查找表需要在查找表中以及在使用它的主表中的每条记录中进行更改。
当您定义 ID 时,您也可以保证唯一性。但是,当您将例如电子邮件作为唯一标识符时,您会将唯一性责任转移到不受信任的第三方。