AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 322
Accepted
Jonas
Jonas
Asked: 2011-01-06 18:21:20 +0800 CST2011-01-06 18:21:20 +0800 CST 2011-01-06 18:21:20 +0800 CST

使用 UUID 或 GUID 作为主键有什么缺点?

  • 772

我想建立一个分布式系统。我需要将数据存储在数据库中,使用UUID或GUID作为某些表的主键会很有帮助。我认为这是这种设计的一个缺点,因为 UUID/GUID 非常大而且它们几乎是随机的。另一种方法是使用自动递增的 INT 或 LONG。

使用 UUID 或 GUID 作为我的表的主键有什么缺点?

我可能会使用 Derby/JavaDB(在客户端)和 PostgreSQL(在服务器上)作为 DBMS。

postgresql primary-key
  • 3 3 个回答
  • 41196 Views

3 个回答

  • Voted
  1. Best Answer
    Brian Ballsun-Stanton
    2011-01-07T02:58:41+08:002011-01-07T02:58:41+08:00

    这取决于您的生成功能和决赛桌的大小

    GUID 旨在成为全局唯一标识符。正如Postgres 8.3 文档中所讨论的,没有普遍适用的方法来生成这些标识符,但 postgreSQL 确实附带了一些更有用的候选者。

    从您的问题范围和对离线写入的需求来看,您已经非常巧妙地排除了除 GUID 之外的任何东西的使用,因此其他方案没有补偿优势。

    从功能的角度来看,密钥长度在任何类型的现代系统上通常都不是问题,这取决于读取次数和表的大小。作为一种替代方法,离线客户端可以在没有主键的情况下批量处理新记录,并在重新连接时简单地插入它们。由于 postgreSQL 提供“串行”数据类型,如果客户端可以执行对数据库的简单写入,则永远不需要确定 ID。

    • 31
  2. Ross
    2012-04-30T11:32:21+08:002012-04-30T11:32:21+08:00

    还有一个建议 - 永远不要将 GUID 用作聚集索引的一部分。GUID 不是连续的,因此如果它们是聚集索引的一部分,则每次插入新记录时,数据库都需要重新排列其所有内存页面以找到正确的插入位置,以防 int(bigint) 自动递增,它将只是最后一页。

    现在,如果我们看一些 db 实现:1.) MySQL - 主键是集群的,没有改变行为的选项 - 建议在这里根本不使用 GUID 2.) Postgres,MS-SQL - 你可以将 GUID 设置为主键非聚集,并使用另一个字段作为聚集索引,例如 autoincrement int。

    • 22
  3. jcolebrand
    2011-01-06T19:10:19+08:002011-01-06T19:10:19+08:00

    这取决于。

    说真的,到目前为止,你已经付出了一切,这是你能做到的。

    为什么使用 UUID 会有帮助?为什么不使用INT?为什么以后不能在 UUID 上建立索引?你明白拥有一个带有 UUID 键的排序列表并在几百万行之后插入一个随机(非顺序)UUID 意味着什么吗?

    这将在什么平台上运行?多少个磁盘?有多少用户?有多少记录?

    • 2

相关问题

  • 字符与整数主键

  • 运行时间偏移延迟复制的最佳实践

  • 存储过程可以防止 SQL 注入吗?

  • PostgreSQL 中 UniProt 的生物序列

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve