我可以依赖.Net中的GUID多少钱?

时间:2011-09-13 06:51:58

标签: c# sql primary-key guid

我可以依赖.Net中的GUID多少钱? 我的SA告诉我那个

  

我们将在所有表中使用GUID作为主键。

我想知道GUID作为主键的可靠性。

是否有可能存在重复?

  

我们真的应该这样使用吗?

     

表现怎么样?

任何建议对我都有帮助。

6 个答案:

答案 0 :(得分:6)

这是GUID的一些要点,可以给你回答

优势:

  1. 整个服务器都很独特。
  2. 缺点:

    1. 在连接,索引和条件中使用时,字符串值不如性能的整数值那么理想。
    2. 比INT更需要更多存储空间。
    3. 您可以阅读以下完整帖子:SQL SERVER – GUID vs INT – Your Opinion

答案 1 :(得分:4)

是的,可能有重复,但它不会。 GUID是32个字符长,每个字符可以是0-F(十六进制)。这意味着16 ^ 32种可能性。

因此,如果您在10年内每秒生成1 000 000个GUID,则创建副本的可能性大约为1/1079028307080601418897053。

在我看来,GUID是一个非常好的主键候选者,因为你可以从任何地方生成,而无需先检查它是否已存在于数据库中。

答案 2 :(得分:4)

您可能想看一下这些文章:

http://www.codinghorror.com/blog/2007/03/primary-keys-ids-versus-guids.html
http://databases.aspfaq.com/database/what-should-i-choose-for-my-primary-key.html

我个人使用整数,如果我不需要主键在几个表和数据库中是唯一的。我发现使用87调试比2A734AE4-E0EF-4D77-9F84-51A8365AC5A0更简单。

答案 3 :(得分:3)

感谢Birthday Paradox (Problem),如果你生成2 ^ 64 GUID,你有大约50%的人找到重复...你开心了吗? (这是因为一个完全随机的GUID长128位,所以有2 ^ 128个不同的GUID。生日悖论告诉我们,如果你有大约sqrt(2 ^ 128)GUID你有50%的碰撞几率我说完全随机的GUID,因为有一些标准类型的GUID,其中一些数字是固定的。但.NET不使用这些标准(请阅读http://en.wikipedia.org/wiki/Globally_unique_identifier))

我要补充一点,如果你的问题是db的“速度”问题,你应该读到这个:

Improving performance of cluster index GUID primary key

答案 4 :(得分:2)

在大多数情况下,您可以假设它们永远不会复制,如果表中的ID设置为主键,则无论如何插入重复都会出错。

在Web应用程序中使用这些ID的一个优点是用户无法仅使用其他ID测试URL,因此理论上会更安全(尽管您应该对权限进行服务器验证)

答案 5 :(得分:0)

Guids在统计上非常可能是唯一的,因此如果各种系统生成ID并且所有这些都需要组合,则它们是主键的良好候选者。

EG。以脱机模式工作并将更改推回到中央数据库。