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

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


当前回答

优点:

UUID值在表和数据库之间是唯一的。这就是为什么它可以合并两个数据库或分布式数据库之间的行。 UUID在url中传递比整型数据更安全。 如果一个UUID通过url传递,攻击者无法猜测下一个id。但是如果我们传递Integer类型,例如10,那么攻击者可以猜测下一个id是11,然后是12等等。 UUID可以离线生成。

其他回答

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

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

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

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

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

如果您还将该列用作聚集索引(一种相对常见的做法),那么使用GUIDS作为主键需要考虑的另一个小问题是。你会在插入时受到打击,因为guid的本质不是按顺序开始的,因此当你插入时,它们会出现页面分割等。只是需要考虑的问题,如果系统将有高IO…

有一件事没有真正解决,即使用随机(UUIDv4) id作为主键将损害主键索引的性能。无论表是否围绕键聚集,都会发生这种情况。

RDBMs通常确保主键的唯一性,并确保在一种名为BTree的结构中按键进行查找,这是一种具有较大分支因子的搜索树(二叉搜索树的分支因子为2)。现在,一个连续整数ID将导致插入只发生在树的一侧,而大多数叶节点不受影响。添加随机uuid将导致插入拆分整个索引中的叶节点。

同样地,如果存储的数据主要是临时的,通常情况下需要访问最新的数据,并根据最新的数据进行连接。对于随机uuid,模式将无法从中受益,并将访问更多的索引行,因此需要内存中更多的索引页。如果最需要最近的数据,那么使用顺序id,热索引页将需要更少的RAM。

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

优点:

UUID值在表和数据库之间是唯一的。这就是为什么它可以合并两个数据库或分布式数据库之间的行。 UUID在url中传递比整型数据更安全。 如果一个UUID通过url传递,攻击者无法猜测下一个id。但是如果我们传递Integer类型,例如10,那么攻击者可以猜测下一个id是11,然后是12等等。 UUID可以离线生成。