Laravel:你现在可以使用 UUID 和 ULID

Laravel:你现在可以使用 UUID 和 ULID

我们有点超前标准,虽然

Photo by 帕维尔·切尔温斯基 on 不飞溅

Laravel 的最新功能是兼容 Eloquent 模型 UUID 或 ULID 作为主键 .我很快就实现了我自己的想法,但总的来说,我们得到的还不错。确实,我会将它们包括在 Larawiz.com 为您的新项目。

并不是从未考虑过它,而是 UUID 在服务中并没有那么流行以混淆记录的数量,或者出于安全原因使其不可预测。嗯,现在它已成为许多服务的标准,所以它使感觉选择加入。

Integrating UUID or ULID as primary keys into a model are just a trait away.

一旦 Laravel 9.31 下周登陆,你应该可以同时使用它们,但是在盲目地使用 ULID 之前,你应该考虑一些注意事项。

进入 UUID 和 ULID 兔子洞

UUID 现在已经成为大多数系统的标准。 UUID 有五个标准化版本,最值得注意的是提供纯随机性的 v4。有 用于创建唯一标识符的许多其他类似解决方案 ,各有各的优缺点。

UUID 的一个常见缺点是 按字典顺序排序 .换句话说,由于第一个位总是随机的,因此您无法对它们进行任何排序 高性能的 方法。这就是 ULID 和 UUID v7 发挥作用的地方。

How an UUID v7 and ULID stack each other using a very similar construction.

ULID 规范出现在 2017 年,作为解决长度和排序问题的一种方法。它首先将毫秒精度的时间戳放入 48 位,然后再放入 72 位随机字节。此外,它可以表示为不区分大小写的 26 字符表示(5 位字符加上填充)。

此标识符类型早于新提议的 RFC 4122 三年,用于标准化 UUID v6、v7 和 v8。你可以说 UUID v7 本质上是一个 ULID 减去 26 个字符的表示。从那里开始,无法确定数据库是否会提供自动生成的 UUID v6-v8,并且可能永远不会与 ULID 兼容,因为它不是 Internet 标准,而更像是对 UUID 的修补工作。

此外,ULID 没有保留版本和变体字节。这些也是随机的,这使它们成为非 UUID 标准但仍然兼容。实际上,它们在任何地方都可以正常工作,但如果严格验证是您的目标之一,您可能希望自己覆盖版本和变体字节,具体取决于您生成它们的方式。

UUID v7 是未来,而不是现在

对主键进行排序是对多条记录进行分页,甚至是插入表中的最后一条记录的一种非常高效的方法。这就是为什么 UUID v7 可能是许多应用程序的首选。

Laravel 将创建一个 ULID 作为 26 个字符的字符串。虽然 ULID 与 UUID 兼容,但如果您计划将其存储为 128 位 UUID,则需要做一些额外的工作,如果您计划将其显示为应用程序外部的 ULID,则需要更多工作。

Creating an ULID as UUID v7 and back from a string on an Eloquent Model.

如果您为数据库选择“ULID 字符串”路线,请做好准备。 该索引将比二进制 UUID 大 62% 并且可能慢 ;一个 ULID 字符串使用 208 位,比二进制 UUID 多 80 位,有些数据库更少 高效的 使用字符串作为主键时。另外,考虑到这 26 个字符不区分大小写——你必须对它们进行解析和规范化。

现在,我说 UUID v7 是未来,因为它们是可排序的、与 UUID 兼容的并且可以作为二进制存储,并且可以表示为 ULID。它不会是 当下 很快,因为主要的数据库引擎不支持对 UUID 或二进制列进行排序。只需询问 PostgreSQL 用户是否可以使用 最大值(uuid) .

此外,与其他替代方案相比,ULID 仍然很大,例如 哈希ID .后者一直是我的首选解决方案,因为它是严格的表现形式。它通过加密密钥从整数创建一个唯一的短字符串。需要注意的是,如果重新生成加密密钥,它会破坏所有 URL,如果它泄漏,那么猫就出局了,每个人都会知道记录的数量。

ULID 和 UUID v7 的一个优点是可以少考虑一个表列。由于您可以通过剥离 UNIX 纪元毫秒并通过应用程序将其转换为 UNIX 时间戳来推断记录的创建,因此 created_at 列在具有时间戳的 Eloquent 模型中变得多余。您不再需要查询该列。

那么 Str::orderedUuid() 呢?

你们中的许多人可能都知道, Str::orderedUuid() 是一件事。 它创建相同的 UUID v7,但有一些细微差别 ,因此选择 UUID v7 或“Ordered UUID”实际上是相同的。

所以是的,由于可排序性、通过 ULID 的短字符串表示以及与当前 UUID/二进制主键的追溯兼容性,UUID v7 可能是应用程序的未来。我们唯一需要的是一个批准的标准——如果我的预感是正确的,可能在 2023 年——以及主要的数据库供应商为 UUID 和二进制列添加排序功能。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/36804/45371609

posted @ 2022-09-16 09:46  哈哈哈来了啊啊啊  阅读(585)  评论(0编辑  收藏  举报