这取决于您的引擎。普遍的看法是,读取很便宜,在这里和那里只有几个字节不会显着影响中小型数据库的性能。
更重要的是,这取决于您将主键用于什么用途。整数序列具有易于使用和实现的优点。它们也取决于序列化方法的具体实现,具有可快速派生的优点,因为大多数数据库只是将序列号存储在固定位置,而不是动态获取Select max(ID)+1 from foo
。
问题就变成了:5个字符的键如何为您和应用程序提供“有意义的值”?与找到递增的序列号相比,如何创建此值,并且花费多少时间?尽管以一些整数节省了很少的空间,但是绝大多数系统将忽略这种空间节省。
没有任何性能影响,但字符方案要求永远不要有自动引擎,因为您的“键”是可以理解的。对于您的特定域,不要理会人工密钥,而只需使用中文,日语和泰语作为关键字名称。虽然您不能保证在任何可能的应用程序中都具有唯一性,但在您的范围内,使用它们而不是可怕且强制的5个字符的缩写要合理得多。直到拥有数百万个元组,才不会对性能产生重大影响。
另外,如果您只是按原产国而不是特定的地区美食(广东话,四川,西西里,翁布里亚,卡拉布里亚,尤卡坦,瓦哈卡等)进行跟踪,则始终可以使用ISO 3166代码。
如果我有10,000个食谱,那么5个字符和20个字符的键之间的区别就不会开始累加吗?
空间很便宜。当您说要进行OLAP操作的10,000,000条配方时,也许是这样。拥有1万个食谱,您将拥有150k的空间。
但同样,这取决于。如果您有数以百万计的记录,并且正在对它们进行联接,那么可以合理化对这种琐碎的事情的查找规范化(到物化视图中)。出于所有实际目的,现代机器上5个字符的键和可变长度的键之间的相对连接效率是如此相似,以致于相同。幸运的是,我们生活在一个拥有大量CPU和大量磁盘的世界中。讨厌的联接太多,查询效率低下,而不是逐个字符进行比较。如此说来,请务必进行测试。
如此级别的P&T事物非常依赖数据库,因此泛化非常困难。构建数据库的两个样本模型,用估计的记录数填充它们,然后查看哪一个更快。以我的经验,字符长度与良好的索引,良好的内存配置和其他关键性能调整元素相比并没有太大的区别。