主键类型Guid还是Int?

时间:2018-05-11 19:05:29

标签: sql sql-server

我想知道sql server中PK的推荐类型是什么?我记得很久以前的阅读this article,但现在我想知道仍然是一个明智的决定仍然使用GUID。

让我想到它的一个原因是,现在很多网站都使用网址中的ID Course/1来获取有关该记录的信息。

你无法用guid真正做到这一点,这意味着你需要一些独特的新专栏并使用它,当你必须确保每个记录都有一个唯一的数字时,还有更多的工作。

3 个答案:

答案 0 :(得分:2)

从来没有“一个解决方案适合所有人”。您必须仔细设计您的架构并为您的场景选择最佳选项。 INTGUID类型都是有效的选项,就像以前一样。

您绝对可以在网址中使用GUID。实际上,在大多数情况下,出于安全原因,最好在URL中使用GUID(或其他随机ID)而不是顺序数字ID。如果您使用顺序ID,您的网站访问者将能够轻松猜出其他用户的ID并可能访问其内容。例如,如果我的个人资料网址是/ Profiles / 111,我可以尝试使用Profile / 112并查看是否可以访问它。如果我的预订网址是Reservation / 444,我可以尝试预订/ 441,看看会发生什么。我可以轻松猜出系统中的其他ID。当然,您必须拥有强大的权限,因此我不应该看到那些不属于我的帐户的其他页面,但如果您的权限和安全性存在任何问题或漏洞,则可能会发生违规行为。使用GUID和其他随机ID时,无法猜测系统中的其他ID,因此这种违规行为要困难得多。

顺序ID的另一个问题是,您的用户可以猜测您拥有的帐户或记录数量及其在数据库中的顺序。如果我的ID是50269,我知道你必须拥有几乎这么多的记录。如果我的身份证是4,那么我知道你注册时我的帐户很少。出于这个原因,许多开发人员在一些随机的高数字(例如1529而不是1)上启动第一个ID。它不能完全解决问题,但它避免了小ID的问题。所有猜测的重要性取决于系统,因此您必须仔细评估您的场景。

这是您在问题中提到的文章中提到的好处的首要问题。但是,在某些方面,整数更好,因此请为您的方案选择最佳选项。

编辑要回答您在评论中提出的有关用户友好网址的观点。在这些情况下,序号是错误的答案。更好的解决方案是URL中的唯一字符串,该字符串链接到您的数字ID。例如,Cars电影在IMDB上有这个URL:

https://www.imdb.com/title/tt0317219/

现在,将它与维基百科,烂番茄,插入或Facebook上同一部电影的网址进行比较:

https://en.wikipedia.org/wiki/Cars_(film)
https://www.rottentomatoes.com/m/cars/
https://www.pluggedin.ca/movie-reviews/cars/
https://www.facebook.com/PixarCars

我们必须同意这些网址比IMDB更友好。

答案 1 :(得分:0)

我使用SQL和Oracle从事小型,中型和大型实施(100k +用户)。在需要时使用PK类型INT的主要时间。 GUID在10 - 15年前更受欢迎,但即使在它的高度也不如INT。除非你认为有必要,否则我会推荐INT。

答案 2 :(得分:-1)

根据您提到的文章:

  

GUID在每个表,每个数据库,每个服务器上都是唯一的

嗯......这是一个很好的承诺,但未能实现。 GUID应该是唯一的雪花。然而,现实要复杂得多,并且有很多原因导致他们最终没有独特性。

其中一个主要原因与UUID / GUID规范无关,但与其实施不当有关。例如,一些Javascript实现排名最差,使用可预测的伪随机数。其他实现更加体面。

所以,最重要的是,研究你将要使用的UUID / GUID的具体实现。不要只是阅读并信任规范。否则,当你在周六晚上凌晨3点被愤怒的顾客打电话时,你可能会感到惊讶。