数据库 - 字符串作为主键?
Databases - String as Primary key?
我使用 Laravel 5 开发应用程序并在开发过程中使用 sqlite。我想稍后切换到更快的东西。我想要一个字符串作为用户的唯一标识符-table。这是一个问题吗?例如外键?还是自增整数没有区别?
简短的回答:使用字符串作为主键非常好。
长答案:我们不擅长选择字符串作为主键。
什么是好的主键候选者?
- 它应该是唯一的。
- 它应该很少改变,如果有的话。
现在,您可能认为您的字符串永远不会改变,而且它非常独特,直到它不再是唯一的。
另一个(次要)问题是性能。搜索、连接等在整数上比在字符串上快一点,主要是由于长度(数字通常比字符串短,所以比较更容易)。
我会仔细考虑在主键上使用什么字符串,大多数时候这是个坏主意
字符串的索引与增量 int 有很大不同,但您可以毫无问题地将它作为主键。
插入时的碰撞检测是一个您必须自己处理的问题,甚至在自动增量情况下也不存在。
从外键的角度来看也不会有任何问题,您将面临的唯一问题是 char/varchar 的效率低于整数。
我使用 Laravel 5 开发应用程序并在开发过程中使用 sqlite。我想稍后切换到更快的东西。我想要一个字符串作为用户的唯一标识符-table。这是一个问题吗?例如外键?还是自增整数没有区别?
简短的回答:使用字符串作为主键非常好。
长答案:我们不擅长选择字符串作为主键。
什么是好的主键候选者?
- 它应该是唯一的。
- 它应该很少改变,如果有的话。
现在,您可能认为您的字符串永远不会改变,而且它非常独特,直到它不再是唯一的。
另一个(次要)问题是性能。搜索、连接等在整数上比在字符串上快一点,主要是由于长度(数字通常比字符串短,所以比较更容易)。
我会仔细考虑在主键上使用什么字符串,大多数时候这是个坏主意
字符串的索引与增量 int 有很大不同,但您可以毫无问题地将它作为主键。
插入时的碰撞检测是一个您必须自己处理的问题,甚至在自动增量情况下也不存在。
从外键的角度来看也不会有任何问题,您将面临的唯一问题是 char/varchar 的效率低于整数。