使用 nanoid 作为主键有什么缺点吗?

Are there any downsides to using nanoid for primary key?

我知道 UUID 和递增整数通常用于主键。 我正在考虑使用纳米机器人,因为它们 URL 友好,不会被猜测/暴力破解(比如递增整数)。

有什么理由不在像 Postgres 这样的数据库中使用 nanoid 作为主键? (例如:也许它们大大增加了查询时间,因为它们没有……对齐或其他原因?)

https://github.com/ai/nanoid

我不确定使用纳米机器人是否有缺点,但它们通常是不必要的。虽然 UUID 很长,但可以将它们转换为较短的格式而不会丢失熵。

查看 NPM 包 (https://www.npmjs.com/package/short-uuid)。

大多数数据库使用递增 id,因为将新值插入到基于 B-tree 的索引的末尾效率更高。

如果在 B-tree 中间的随机位置插入一个新值,它可能必须拆分 B-tree 非终结节点,这可能会导致下一个更高的节点要拆分的级别,依此类推直到 B-tree.

的顶部

这也有导致碎片的更大风险,这意味着对于相同数量的值,索引需要更多 space。

阅读 https://www.percona.com/blog/2015/04/03/illustrating-primary-key-models-in-innodb-and-their-impact-on-disk-usage/ 以直观地了解在主键中使用 auto-increment 与 UUID 之间的权衡。

该博客是关于 MySQL 的,但同样的问题适用于任何基于 B-tree 的数据结构。