【问题标题】:Using UUID in CakePHP, What DataType Is Recommended?CakePHP中使用UUID,推荐什么DataType?
【发布时间】:2012-09-20 17:19:08
【问题描述】:

我的场景:

  • 新的 Cake (2.x) 项目,还没有 DB
  • MySQL 集群,也许是 Oracle 集群产品
  • 无需迁移/导入数据
  • 数据可能如下所示:Users -> HABTM -> Groups -> HABTM -> Other Groups

我一直在对如何在 CakePHP 中使用 UUID 进行一些研究,我发现了以下内容:

Cake 原生支持 UUID,但它假定 CHAR(36):

http://book.cakephp.org/2.0/en/getting-started/cakephp-conventions.html

Stack Answer 指出:

将 UUID 作为 CHAR(36) 的成本高得离谱,并且变成 愚蠢的 1+ 百万,10+ 百万,100+ 百万行,在我的卑微 经验

这个Blog Post声称BINARY(36)优于CHAR(36)

虽然 CakePHP 不支持 16 字节十六进制编码的 UUID BINARY(16) 的键类型,它确实支持 BINARY(36),它仍然是 比使用 CHAR(36) 更好,它可以通过排序来减慢。

...但是 Cake Docs 并没有这么说...

我的问题是,考虑到 CakePHP/MySQL(或 CakePHP/Oracle),CHAR(36) 是这里唯一合理的选择,还是有更好、更有效的方法来使用带有 CakePHP(或任何其他 PHP 框架)的 UUID那件事)?

【问题讨论】:

  • 请记住,如果您使用innodb,那么您的主键将被附加到每个索引并且您将有一个显着的开销在索引大小。通常,PK 数据类型越小越好。就个人而言 - 我更喜欢总是使用整数。
  • 同意开销,但不幸的是,对于此应用正在创建的记录,它们需要是全球唯一的,这确实会影响性能。
  • 我同意,BINARY 比 CHAR 性能要好得多,这里记录了 3.x 方式:github.com/dereuromark/cakephp-shim/blob/3.0/docs/…
  • BINARY(16) 的性能甚至更高,但是需要在 DB 中显式地显示 hexing 和 unhexing 值的麻烦会让你避免它。顺便说一句,一篇旧博客文章提到了CHAR(36)BINARY(16) 的快速基准测试是here,我相信BINARY(36) 将介于这两者之间;可能更倾向于好的一面;)
  • @mark 链接已失效,是否有其他来源?

标签: php mysql oracle cakephp-2.0 uuid


【解决方案1】:

如果给 CakePHP 一个模型,其 id 字段的 SQL 类型为 Binary(36),那么每次创建新记录时,都会为 id 字段赋予一个新的 GUID 值。从 1.3.15 版本开始,此行为就出现了。

关于您的其他问题,由于 CHAR 涉及排序规则,我会选择二进制解决方案。

【讨论】:

    【解决方案2】:

    您可能已经知道这一点,但您可以为新记录生成一个带有 String::uuid() 的 id,并在您的表中添加 BINARY(36) - 我认为 cake 在 uuid 生成之后没有任何自动化。

    【讨论】:

    • 是的,我的应用程序现在正在为新记录执行此操作,并且此策略暂时有效。
    • 我认为 cake 在 uuid 生成之后没有任何自动功能 CakePHP 可以根据文档生成和生成并使用 uuid 作为主键字段。虽然,他们提到 CHAR(36) 因为 DB 中的列类型是开箱即用的,但我真的怀疑 BINARY(36) 在没有填充程序或解决方法的情况下也能正常工作。感兴趣的小笔记是here。一般而言,在您在github 上回答后近 3 年就发生了关于此主题的讨论
    猜你喜欢
    • 2016-02-23
    • 2017-11-04
    • 2011-10-22
    • 2011-04-11
    • 2021-10-12
    • 2012-12-07
    • 2012-05-16
    • 2020-06-29
    • 2014-08-11
    相关资源
    最近更新 更多