首页 > 解决方案 > 主键类型 Guid 还是 Int?

问题描述

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

让我想到它的一个原因是,如今许多网站都使用 url 中的 id 来Course/1获取有关该记录的信息。

您不能使用 guid 真正做到这一点,这意味着您需要一些独特的新列并使用它,因为您必须确保每条记录都有一个唯一的编号,所以还需要做更多的工作。

标签: sqlsql-server

解决方案


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

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

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

这是您在问题中提到的文章中提到的好处的顶部。但是,在某些领域,整数会更好,因此请为您的场景选择最佳选项。

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

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

现在,将其与维基百科、烂番茄、Plugged In 或 Facebook 上同一部电影的 URL 进行比较:

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

我们必须同意,这些 URL 比 IMDB 中的 URL 友好得多。


推荐阅读