Doctrine Annotations type =" guid"和策略=" UUID"行为?

时间:2015-08-12 06:31:59

标签: php symfony doctrine-orm

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

/**
 *
 * @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 个答案:

答案 0 :(得分:18)

简短回答: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的聪明人:-)

  4. 关于排序

    在当前使用的最常见版本(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评论,答案得到了改善,这增加了宝贵的贡献并迫使我学习了更多关于这个主题的内容。