mysql - 外键的 UUID
问题描述
为什么将 UUID 用作主键?它们需要大量内存来存储。据我了解,它们被用作主键,因为每个生成的值都是唯一的,这在合并 2 个数据库时很有帮助,因为不会发生冲突。
如果 UUID 用于 API 端点猜测的隐私,为什么不使用 ID、数据库编号。然后使用它作为主键对它们进行散列?然后ID可以用于关系,很方便。ID 和数据库编号的哈希值。可以用于primary_key,使用ID查找数据条目也比UUID快。
解决方案
通用唯一 ID (UUID) 主要用于:
- 在各种系统中生成标识符而不需要与中央机构协调(例如数据库服务器中的序列号生成器)。
- 在系统之间共享数据记录,例如联合数据库,没有冲突的风险。
据我所知,您关于 API 端点猜测隐私的观点最初并不是设计目标。但考虑到当代基于 URL 的访问方法,它可能是另一个特性。
UUID 实际上是一个128 位的值。不要将其与通常用于向人类显示的 36 个字符的十六进制字符串混为一谈。
对于支持 UUID 作为数据类型的数据库,例如 Postgres,使用 UUID 数据类型的键使用的内存和存储空间是 64 位整数序列号的两倍,或者是 32 位整数(40 亿范围)的四倍),这是代理键的通常其他选择。这是否是“很多”是每个数据库设计人员需要做出的判断。鉴于现代计算硬件中内存和存储空间的价格低廉且易于使用,我通常认为 UUIDS 的好处非常值得额外的内存/存储。
如果您需要通用唯一 ID,请使用通用唯一 ID (UUID)。无需自己发明。
推荐阅读
- nginx - 关于Nginx的使用
- mysql - 创建 MySQL 过程
- php - 从 PHP5 迁移到 PHP7 后,PHP Pear HTML-IT 不呈现
- java - 如何修复变量不等于用户输入
- javascript - MUIdatatables 如何使用箭头/tab 键导航?
- javascript - 懒加载:如何用pdf.js将多个pdf文档显示为一个?
- javascript - 如何在 ReactJS 的 Switch 语句中包含组合函数的结果
- java - 使用 Consumer Key 和 Secret 发送 post 请求时抛出 scribejava NoClassDefFoundError
- python - pandas 或 numpy 数组数据元素格式化
- javascript - 打字稿导出错误使我无法正确运行代码