繁体   English   中英

Doctrine Annotations type =“guid”和strategy =“UUID”行为?

[英]Doctrine Annotations type=“guid” and strategy=“UUID” Behavior?

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

/**
 *
 * @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

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

简短回答: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

哪里

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM