Doctrine Annotations type=“guid” and strategy=“UUID” Behavior?一些背景关于排序

2022-08-31 00:55:28

好的,所以我只想知道这个注释的行为是做什么的:

/**
 *
 * @ORM\Id
 * @ORM\Column(name="id", type="guid")
 * @ORM\GeneratedValue(strategy="UUID")
 */
protected $id;

当我向表中插入行时,键是否按递增顺序排列?

我知道钥匙不像 那么简单,它的行为就像00001000002

  • 007f13ff-ce26-11e4-8e3d-a0b3cce9bb7e
  • 00805a63-ce26-11e4-8e3d-a0b3cce9bb7e
  • 0b1b6ca9-d178-11e4-8e3d-a0b3cce9bb7e

但我的问题是,键是否按特定顺序排列,例如插入的第一行是比最后一个值更低的字母数字值。总是?


答案 1

简短的回答:UUID不是按特定顺序排列的。

一些背景

UUID是自动增量整数的替代方案,自动增量整数正变得越来越常用,因为它们具有一些优点。

  1. 插入 65537 记录(或类似的 2^x + 1,具体取决于 ID 的原始大小)时,不会中断应用程序。最糟糕的情况是你有一个重复的标识符,但这非常不可能:https://en.wikipedia.org/wiki/Universally_unique_identifier#Random_UUID_probability_of_duplicates

  2. 您可以在存储记录之前在代码中生成它们;您不必从数据库中获取“last_insert_id”。这很好,例如,当您还必须将一些相关记录存储在不同的表中时(当然,Doctrine可能会为您处理此事,但这是另一回事)。

  3. 你不会把表格中的记录数量透露给一个聪明的家伙,他可以读取当前订单的ID:-)

关于排序

在当前最常用的版本 (v4) 中,UUID 是纯随机的,因此它们不按特定顺序排列。

版本 1 UUID 是 60 位时间戳与 48 位 MAC 地址的组合。

当您使用 Doctrine UUID 策略时,您基本上是在使用特定于数据库的实现(即 函数)。在MySQL 5.7的情况下,它是一个v1兼容的模式,它将UUID生成为UUID()

aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee

哪里

  • aaaaaaaa是时间戳的低部分
  • bbbb是时间戳的中间部分
  • cccc是时间戳的高部分
  • dddd在调整时间的情况下增加时间唯一性
  • eeeeeeeeeeee是节点 ID(MAC 地址)

由于时间戳是反向的,因此如果您在短时间内生成多个UUID,则会对它们进行排序,但从长远来看,它们不会被排序。考虑使用当前秒数作为 UUID 的第一部分。

注意:由于@Etki评论,答案得到了改进,这增加了宝贵的贡献,并迫使我更多地了解该主题。


答案 2

推荐