2015-04-16 65 views
1

我使用Laravel 5开发应用程序,并在开发期间使用sqlite。我想稍后更快地切换到某些东西。我想有一个字符串作为用户表的唯一标识符。这有什么问题吗?例如与外键?或者自动增加整数没有区别吗?数据库 - 字符串作为主键?

+2

字符串可以是主键。添加“唯一”约束。但是你不能添加“auto_increment”约束。 http://www.sqlite.org/lang_createtable.html#constraints – user2267379

回答

4

简短的回答:使用字符串作为主键是完全正确的。

长答案:我们在选择字符串作为主键时非常糟糕。

什么是优秀的主要关键人选?

  1. 它应该是唯一的。
  2. 它应该很少,如果有的话,改变。

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

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

漫长而艰难的,我觉得到主键使用的字符串,很多时候这是一个坏主意

+0

感谢您的回答。我想使用字符串作为标识符的主要原因是我使用thrid-party api服务来获取实际的用户数据,并希望将其用户id用作我的id。或者这是一个坏主意? – norbertVC

+0

如果您将通过使用第三方ID保存查询,并且ID唯一性已经是他们为您解决的问题,我不明白为什么这将是一个坏主意 – FabioCosta

+0

我同意法比奥,实质上这是他们的问题,你只是他们数据的消费者。我不知道如果一个主键在他们的末端改变会发生什么,但:) – Patrick

1

字符串的索引比增量有很大不同INT,但你可以把它作为主键没有问题。

插入时碰撞检测是一个问题,你必须自己处理,甚至不会存在于自动增量情况下。

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