我过go 在许多数据库系统上工作过,如果所有数据库键都是GUID / UUID个值,那么在数据库之间移动条目会容易得多.我已经考虑过几次走这条路,但总是有一些不确定性,特别是关于性能和无法通过电话读取的URL.

有人在数据库中广泛使用过GUID吗?我走那条路会有什么好处,可能的trap 是什么?

推荐答案

优势:

  • 可以离线生成它们.
  • 使复制变得微不足道(与int相反,这使得复制变得非常困难)
  • 奥姆通常和他们一样
  • 在所有应用程序中都是唯一的.因此,我们可以在我们的应用程序(也是GUID)中使用CMS(GUID)中的PK,并且知道我们永远不会发生冲突.

缺点:

  • 使用较大的空间,但空间较便宜(呃)
  • 无法按ID排序以获取插入顺序.
  • 在URL中可能看起来很难看,但说真的,你要在URL中放一个真正的DB键吗!?(这一点在下面的 comments 中有争议)
  • 手动调试比较困难,但也不是很难.

就我个人而言,我在任何规模合适的系统中使用它们进行大多数PK,但我在一个到处复制的系统上接受了"培训",所以我们必须拥有它们.YMMV.

我认为重复数据是垃圾——不管你怎么做,你都可以得到重复数据.在我工作过的地方,代用 keys 通常是不受欢迎的.不过,我们确实使用了类似WordPress的系统:

  • 行的唯一ID(GUID/任何值).用户永远看不到.
  • 公共ID从某个字段生成一次(例如标题-使其成为文章的标题)

UPDATE:个 所以这个得到了很多+1,我想我应该指出GUID PK的一个很大的缺点:聚集索引.

如果您有很多记录,并且GUID上有聚集索引,那么您的插入性能将会很差,因为您会在项目列表中的随机位置(这就是重点)进行插入,而不是在末尾(这很快)

因此,如果需要插入性能,可以使用auto inc INT,如果想与其他人共享,可以生成一个GUID(例如,在URL中向用户显示)

Database相关问答推荐

如何将对象源动态设置为子窗体

Mongo DB使用一对多关系离开JOIN

Postgresql 服务器:允许访问私有网络内的远程连接,而不是外部网络

MySQL FIND_IN_SET 的对面

在哪里存储 PHP 应用程序的数据库登录凭据

数据库中的每个表都应该有一个 SQLiteOpenHelper 吗?

数据库设计:文件路径的首选字段长度

如何在 SQL Server 中将索引从一个表复制到另一个表

用于为 Android 设计 SQLite 数据库的开发人员工具

使用 SQLAlchemy Core 批量插入列表值

查询最后一天、上周、上个月SQLite

Oracle 数据库统计信息应该多久运行一次?

当另一个进程修改数据库时Hibernate二级缓存失效

在内存中创建 SQLite 数据库

Django:将博客条目查看次数加一,这有效率吗?

如何使用 Entity Framework CF 在父级之前删除子实体?

如何在实体框架中使用字符串属性作为主键

使用 Django 的复合/复合主/唯一键

PostgreSQL 的 EXPLAIN ANALYZE 的 MySQL 类似功能是什么

Cassandra - 事务支持