主键:字符串或数字(id)?

时间:2014-05-07 15:06:29

标签: mysql sql postgresql

我知道使用整数(空间量,性能,索引)作为主键与字符串相反的好处。

考虑下面的情况......

我有一个名为ap_habitat的查找表(栖息地值也是唯一的)

id   habitat
1    Forest 1
2    Forest 2

参考表(动物群)

Especie  habitat
X         1
Y         1

引用表不是非常人性化的(我知道最终用户不应该关心它,但对于我来说,直接在动物群表中看到栖息地的名称会很有用)。

要获得动物群及其栖息地名称的清单,我必须加入......

select fauna.habitat, fauna.especie, AP_h.habitat from fauna INNER JOIN ap_habitat AS AP_h on AP_h.id=1

我可以创建一个视图,但是如果我必须为引用外键的每个表创建一个视图......

想知道更多有经验的人推荐我。

2 个答案:

答案 0 :(得分:0)

数据库以及通常的计算机并非旨在让您的生活更加简单。它们的设计目的是处理比人类想要记住的更多数据,而不是人类眨眼所需的时间。 ; - )

可读性(特别是在Apple之前构思的想法中)根本不是问题。

最重要的是:如果您喜欢奇怪的问题,数据映射阻抗并花费无尽的夜晚为使用真实世界名称作为主键的问题编写解决方法,那么请成为我们的客人。但是,请不要求我们的帮助。我们已经知道你遇到的所有问题,我们很难克制自己的问题。

所以:永远不要使用除ID(UUID或长序列)之外的任何东西作为主键。没有(好)理由这样做,如果你找到了,那么你根本就看不到整体情况。

是的,它会使一些事情变得更难(比如了解您的数据实际意味着什么)。但正如我上面所说,计算机意味着要解决大量数据问题。并且"太慢"没有别的。

创建一个视图或编写一个小帮助应用程序,只需点击一下按钮即可运行最重要的查询。

也就是说,我在运行查询的应用程序上取得了一些成功,然后显示了一个复选框列表,我可以将外键关系拉入查询返回的数据(即每个FK一个复选框)。 / p>

答案 1 :(得分:0)

您询问数字或字符串是否为主键。但根据您的示例,如果您使用字符串,它根本就不是主键,因为您将不再拥有查找表,因为它是主键。也许你仍然会因为未显示的原因而拥有该表,例如填充下拉列表或存储超出名称的扩展描述。

做不必要的连接对性能来说不是一件好事。有不必要的表也可能对存储大小有害,这取决于字符串的长度和两个表的大小比例。

您还可以考虑枚举类型,其中数据存储为数字(或多或少),但数据库会自动将它们与字符串进行转换。