Doctrine Annotations type ="guid"和strategy ="UUID"行为?

Har*_*mpo 12 php symfony doctrine-orm

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

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

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

我知道键不是那么简单00001,000002它的行为就像

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

但我的问题是,像第一个插入行一样的特定顺序的键是一个比最后一个值更低的字母数字值.总是?

Fra*_*eni 20

简短回答: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策略时,您基本上使用的是数据库特定的实现(即UUID()函数).在MySQL 5.7的情况下,它是一个v1兼容的模式,它产生UUID

aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
Run Code Online (Sandbox Code Playgroud)

哪里

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

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

注意:由于@Etki评论,答案有所改善,这增加了宝贵的贡献并迫使我学习更多关于这个主题的内容.

  • *UUID 没有特定的顺序* - 取决于版本和生成器 (2认同)
  • 我手头除了无聊的[RFC](https://www.ietf.org/rfc/rfc4122.txt)什么也没有。通常提到的 UUID 是版本 4 UUID,应该是纯粹随机的,因此不保留顺序。然而,版本 1 基本上是时间和特定于节点的值的串联,这迫使它单调递增,因此如果只有一个节点发出版本 1 UUID,它们将是完美排序的(我什至听说有些人坚持使用 v1所以他们的数据已经在插入点进行了某种排序)。 (2认同)
  • 另一个很大的好处是您可以合并不同的数据集而不会发生关键冲突 (2认同)