是否可以使用主键的字符值?

时间:2009-01-15 04:33:52

标签: database database-design optimization schema normalization

在使用数据库表中的唯一数字ID字段与使用基于字符的字段相比时,是否有性能提升或最佳实践?

例如,如果我有两张桌子:

运动员

id ... 17 名称 ... Rickey Henderson teamid ... 28

teamid ... 28 teamname ... 奥克兰

如果 teamid 是“OAK”或“SD”而不是“28”或“31”,那么拥有数千名玩家的运动员表会更容易阅读。让我们理所当然地认为 teamid 值在字符形式上将保持唯一且一致。

我知道你可以使用字符,但是出于任何原因索引,过滤等是一个坏主意吗?

请忽略规范化参数,因为这些表比示例更复杂。

7 个答案:

答案 0 :(得分:16)

我发现无效数字的主键从长远来看会减少头痛。

答案 1 :(得分:4)

由于你提到的所有原因,文字很好。

如果字符串只有几个字符,那么无论如何它几乎都是一个整数。使用字符串的最大潜在缺点是大小:数据库性能与需要多少磁盘访问有关。例如,使索引大两倍可能会产生磁盘缓存压力,并增加磁盘搜索次数。

答案 2 :(得分:3)

我不会使用文字作为您的密钥 - 将来当您想要更改某个团队的团队ID时会发生什么?当主键完全可以避免时,您必须在整个数据中级联该键更改。此外,虽然我没有任何经过验证的证据,但我认为INT密钥会明显快于文本密钥。

也许您可以为数据创建视图,使其更易于使用,同时仍然使用数字主键。

答案 3 :(得分:3)

我只想和你的例子一起滚动。当Doug说文本没问题时,Doug是正确的。即使对于具有3个字母代码的中型(~50gig)数据库,主键也不会杀死数据库。如果它使开发更容易,减少了另一个表上的连接,这是一个用户输入的字段...我说去吧。如果它只是您在页面上显示的缩写,或者因为它使运动员表看起来漂亮,请不要这样做。我认为问题的关键是“这是一个用户输入的代码而不只是从列表中选择的代码吗?”

让我举一个例子,说明我何时使用文本列作为键。我正在制作处理医疗索赔的软件。索赔得到全部数字化后,人们必须查看索赔,然后选择一个代码,指明它是什么样的索赔。有数以百计的代码......而且这些家伙都把它们全部记住了或者用床单来帮助他们。他们多年来一直在使用这些相同的代码。使用3个字母的密钥,他们只需通过索赔处理。

答案 4 :(得分:2)

我建议使用int或bigints作为主键。好处包括:

  • 这允许更快的连接。
  • 在主键中没有语义含义允许您更改具有语义含义的字段,而不会影响与其他表的关系。

您可以随时拥有另一列来保存team_code或“OAK”和“SD”。还

答案 5 :(得分:2)

标准答案是使用数字,因为它们的索引速度更快;无需计算哈希或其他任何东西。

如果你使用一个有意义的值作为主键,如果团队名称发生变化,你必须通过你的数据库更新它。

为了满足上述要求,但仍然可以使数据库直接读取,

  • 使用数字字段作为主键

  • 立即创建一个加入运动员和队伍表的观察员Athlete_And_Team

然后,您可以在手动浏览数据时使用该视图。

答案 6 :(得分:0)

您在谈论主键还是聚集索引?您的聚簇索引应该是您最常用于唯一标识该行的列。它还定义了表中行的逻辑顺序。聚集索引几乎总是您的主键,但在某些情况下它们可能是不同的。