我曾经在许多数据库系统上工作过,如果所有的数据库键都是GUID / UUID值,那么在数据库之间移动条目就会容易得多。我考虑过几次采用这种方法,但总有一些不确定性,特别是在性能和无法通过电话读出的url方面。

有人在数据库中大量使用guid吗?这样做会有什么好处,可能的陷阱是什么?


当前回答

primary-keys-ids-versus-guids

guid作为主键的成本(SQL Server 2000)

神话,GUID vs. Autoincrement (MySQL 5)

这就是你真正想要的。

UUID优点

每个表,每个数据库,每个服务器都是独一无二的 允许轻松合并来自不同数据库的记录 允许跨多个服务器轻松分布数据库 您可以在任何地方生成id,而不必往返于数据库 大多数复制场景都需要GUID列

GUID笨蛋

它比传统的4字节索引值大了4倍;如果不小心,这可能会对性能和存储造成严重影响 调试很麻烦(其中userid='{BAE7DF4-DDF-3RG-5TY3E3RF456AS10}') 生成的guid应该是部分顺序的,以获得最佳性能(例如,SQL 2005上的newsequentialid()),并允许使用聚集索引

其他回答

到目前为止还没有提到的一件事是:uuid使分析数据变得更加困难

至少对于web应用程序来说,通过url中的id访问资源是很常见的,比如stackoverflow.com/questions/45399。如果id是整数,则两者都是

提供有关问题数目的资料(即2008年9月5日,第45,399个问题被问到) 提供了一个迭代问题的杠杆点(当我将其增加1时会发生什么?我打开下一个问题)

从第一点开始,我可以结合问题的时间戳和数字来分析问题被问到的频率,以及它如何随时间变化。这在像Stack Overflow这样的网站上不太重要,因为它有公开的信息,但是,根据上下文,这可能会暴露敏感信息。

例如,我是一家为客户提供权限门控门户的公司。地址是portal.com/profile/{customerId}。如果id是一个整数,您可以通过定期查询lastKnownCustomerCount + 1来分析客户数量,而不管是否能够看到他们的信息,并检查结果是否为404 - NotFound(客户不存在)或403 - Forbidden(客户确实存在,但您没有访问权限)。

uuid的非连续性质缓解了这些问题。这并不是为了防止侧写,但这是一个开始。

主要的优点是您可以在不连接到数据库的情况下创建唯一的id。id是全局唯一的,因此您可以轻松地组合来自不同数据库的数据。这些看起来都是小优势,但在过去却为我节省了很多工作。

主要的缺点是需要更多的存储空间(在现代系统上不是问题),并且id不是真正的人类可读。在调试时,这可能是一个问题。

存在一些性能问题,如索引碎片。但这些都是很容易解决的(梳子guids由吉米尼尔森:http://www.informit.com/articles/article.aspx?p=25862)

Edit合并了我对这个问题的两个答案

@Matt Sheppard我想他的意思是你可以用不同的guid作为主键来复制行。这是任何类型的代理键都存在的问题,而不仅仅是guid。就像他说的,这很容易解决,只需向非键列添加有意义的惟一约束。另一种选择是使用天然钥匙,而这些钥匙存在实际问题。

guid在将来可能会给您带来很多麻烦,如果它们被用作“唯一符”,让重复的数据进入您的表。如果您想使用guid,请考虑在其他列上仍然保持unique -约束。

优点:

可以离线生成。 使复制变得简单(与int's相反,这使得它非常困难) ORM通常是这样的 跨应用程序惟一。所以我们可以在我们的应用程序(也guid)中使用CMS (guid)中的PK,并且知道我们永远不会发生冲突。

缺点:

更大的空间使用,但空间是便宜的 无法按ID排序以获取插入顺序。 可以在URL中看起来很丑,但真的,WTF是你在URL中放一个真实的DB键!?(这一点在下面的评论中有争议) 手动调试比较难,但也没那么难。

就我个人而言,我在任何一个相当大的系统中使用它们进行大多数PK,但我在一个到处都被复制的系统上接受了“训练”,所以我们必须使用它们。YMMV。

我认为重复数据的事情是垃圾-你可以得到重复的数据,无论你做什么。在我工作的任何地方,代理键通常都不受欢迎。我们确实使用类似于wordpress的系统:

行的唯一ID (GUID/其他)。用户永远不可见。 public ID从某些字段生成一次(例如title-让它成为the-title-of- article)

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

如果您有很多记录,并且在GUID上有一个聚集索引,那么您的插入性能将非常糟糕,因为您将插入到项目列表中的随机位置(这是重点),而不是在末尾(这是快速的)。

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

为什么没人提性能?当你有多个连接时,都是基于这些讨厌的guid,性能将通过地板,一直在那里:(