【问题标题】:Using a long string as unique table id (or not)?使用长字符串作为唯一表 ID(或不使用)?
【发布时间】:2012-07-28 08:24:06
【问题描述】:

我知道这已经讨论过很多次了,我希望针对我的具体情况得到建议。

我在做一个社交网站,理论上应该可以在mysql数据库中记录数十亿张照片。

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

优点是:

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

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

“photo_cmets”等其他表在引用照片时也可以使用相同的字符串 id,例如 photo_comment_photo_id='oij43oj54oi52j43i';

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

谢谢。

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

【问题讨论】:

  • 您将如何确保 oij43oj54oi52j43i 是唯一值?自动增量值的设计是有原因的。不要试图模仿已经完美运行的东西,并坚持使用自动增量。
  • @Jocelyn 的唯一性可以通过将照片用户 ID 附加到 php uniqid() 来实现,我编辑了问题以包含此内容。对于用户 25,照片 ID 可能类似于 25oij43oj54oi52j43i
  • 请记住,所有辅助键都使用主键,因此请保持您的主键尽可能小。 64 位 int 比 255 个字符的字符串更可取。

标签: mysql database unique


【解决方案1】:

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

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

Instagram 的版本不是一个纯粹的 UUID,而是一个 64 位版本的足够类似的东西。

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

【讨论】:

    猜你喜欢
    • 2021-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多