数据库 - 字符串作为主键? [复制]

Posted

技术标签:

【中文标题】数据库 - 字符串作为主键? [复制]【英文标题】:Databases - String as Primary key? [duplicate] 【发布时间】:2015-04-16 21:31:05 【问题描述】:

我使用 Laravel 5 开发了一个应用程序,并在开发过程中使用了 sqlite。我想稍后切换到更快的东西。我想要一个字符串作为用户表的唯一标识符。这是一个问题吗?例如外键?还是自增整数没有区别?

【问题讨论】:

字符串可以是主键。添加“唯一”约束。但是你不能添加 "auto_increment" 约束。 sqlite.org/lang_createtable.html#constraints 【参考方案1】:

简短的回答:使用字符串作为主键非常好。

长答案:我们在选择字符串作为主键方面很糟糕。

什么是好的主键候选?

    应该是唯一的。 它应该很少(如果有的话)改变。

现在,您可能认为您的字符串永远不会改变,并且它非常独特,直到它不再是唯一的。

另一个(次要)问题是性能。在整数上搜索、连接等比在字符串上要快一些,主要是由于长度(数字通常比字符串短,所以比较更容易)。

我会仔细考虑在主键上使用什么字符串,大多数时候这是个坏主意

【讨论】:

感谢您的回答。我想使用字符串作为标识符的主要原因是我使用第三方 api 服务来获取实际的用户数据并希望使用他们的 id 作为我的 id。还是这是个坏主意? 如果您将使用第三方 id 保存查询,并且 id 唯一性已经是他们为您解决的问题,我不明白为什么这是一个坏主意 我同意法比奥的观点,本质上这是他们的问题,你只是他们数据的消费者。我确实想知道如果主键最终发生变化会发生什么:)【参考方案2】:

字符串的索引与增量 int 有很大不同,但您可以毫无问题地将其作为主键。

插入时的碰撞检测是您必须自己处理的问题,甚至在自动增量情况下都不存在。

从外键的角度来看,也不会有任何问题,您将面临的唯一问题是 char/varchar 的效率低于整数。

【讨论】:

以上是关于数据库 - 字符串作为主键? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

PHP,可以吗?将密码哈希中的字符串作为主键存储在数据库中?

NHibernate 和字符串主键

字符串作为主键的性能损失?

我们可以在 Sqlite 数据库中使用 Guid 作为主键吗

如何用java中取到作为数据库主键的值?

我是不是应该使用字符串作为对 SEO 很重要的网站的主键?