使用长字符串作为唯一表ID(或不)?

时间:2012-07-30 16:14:23

标签: mysql database unique

我知道这已被多次讨论,我希望能就我的具体案例得到建议。

我正在建立一个社交网站,理论上应该能够在mysql数据库中记录数十亿张照片。

我想知道用一个像'oij43oj54oi52j43i'这样的字符串id替换记录的唯一BIGINT id是否是一个好主意。

优点是:

  1. 我可以将照片记录插入分布在多个服务器上的多个数据库中,这与BIGINT ID不同,您需要等待并在插入时从mysql获取下一个行号。

  2. 如果它是/avatars/oij43oj54oi52j43i.jpg,则允许用户通过输入/avatars/120.jpg之类的整数来随机访问图像的可能性较小。我知道第二部分也可以通过URL重写来完成,但会使用一些CPU / mem。

  3. “photo_comments”等其他表格在引用照片时也可能使用相同的字符串ID,例如photo_comment_photo_id ='oij43oj54oi52j43i';

    考虑到这些,使用字符串ID是一个坏主意吗?特别是对于我提到的第一个优势,是一个有效的点/优势/实践吗?

    谢谢。

    编辑:确保字符串是唯一的可以通过将用户id附加到字符串来完成,也可以使用使用时间戳微秒的php uniqid()

1 个答案:

答案 0 :(得分:3)

如果你正在构建这样的东西,你应该从Instagram获取一个页面并使用UUID而不是顺序ID。它们有许多优点,但最大的优点是它们具有可扩展性和可分解性。

在大多数语言中都有一个简单的UUID库,甚至MySQL都有一个UUID生成器,可以作为最后的手段使用。

Instagram的版本不是纯粹的UUID,而是类似的64位版本。

基本上你应该read this article on Sharding and IDs at Instagram寻求灵感。