这里有很多折衷。实际上,我经常使用字符串键,但是经常包括用于连接的代理辅助键(显然,如果使用MySQL,那将是另一种方法)。在某些情况下我却不这样做。
首先,我喜欢将自然键声明为数据库可以很好处理的主键(例如PostgreSQL)。这有助于规范化,并使数据库设计更加清晰。代理键使加入变得更容易。
我通常添加代理键有两个原因:
并不总是清楚什么是自然键。有时这些必须更改。当将自然的复合键用于联接和参照完整性时,更改十分复杂且容易出错。
复合键上的联接性能存在问题,一旦您走了自然键路线,就会陷入困境。
但是,在自然键为定义键,单列和文本键的情况下,我通常会加入字符串键。我这样做的原因是,这通常避免在查找时加入联接。最常见的用法是围绕枚举类型的用例提供适当的数据库设计。在大多数情况下,这些并没有要求额外加入日常查询。因此,在这种情况下,将字符串键作为连接键很有意义。
例如,在LedgerSMB中,我们存储帐户分类。这些通过字符串引用来标识。一些其他数据与字符串引用一起存储,该字符串引用用于实施有关可能影响帐户的分类组合的规则。唯一需要逻辑的时间是保存一组分类时,因此我们加入字符串键。
至于为什么默认值是整数键,我不认为这只是索引大小的问题。一个大问题是密钥管理。由于密钥是任意的,并且您可能要处理数百万条记录,因此必须有一种生成唯一字符串的方法。在某些情况下,人们为此使用UUID,但是UUID冲突的可能性不为零,并且在存储数十亿条记录的情况下,当增量整数类型发生冲突的可能性为零时,这种机会实际上可能会变得足够高根据定义。