Asp.net 为什么aspnet_用户对id使用guid而不是递增int?扩展用户字段帮助的额外积分

Asp.net 为什么aspnet_用户对id使用guid而不是递增int?扩展用户字段帮助的额外积分,asp.net,authentication,guid,uniqueidentifier,Asp.net,Authentication,Guid,Uniqueidentifier,为什么aspnet_用户对id使用guid而不是递增int 还有什么理由不在其他表中使用它作为主键?这感觉有点奇怪,因为我知道过去使用过的大多数应用程序都只使用普通的int系统 我还将开始使用此id来匹配扩展的详细信息表,以获得额外的用户pref等。我还考虑使用一个包含guid和int的链接表,但决定,因为我认为实际上不需要将用户id作为公共int 虽然我希望使用int(在stackoverflow.com/users/12345/user-name等网站上进行用户查找会更容易),因为我只需要用

为什么aspnet_用户对id使用guid而不是递增int

还有什么理由不在其他表中使用它作为主键?这感觉有点奇怪,因为我知道过去使用过的大多数应用程序都只使用普通的int系统

我还将开始使用此id来匹配扩展的详细信息表,以获得额外的用户pref等。我还考虑使用一个包含guid和int的链接表,但决定,因为我认为实际上不需要将用户id作为公共int

虽然我希望使用int(在stackoverflow.com/users/12345/user-name等网站上进行用户查找会更容易),因为我只需要用户名,但我认为我不需要随身携带此项,并且在需要查找用户int时会增加查找的复杂性


感谢您提供的任何帮助。

它确保了断开连接的系统之间的唯一性。任何可能需要与另一个以前未连接的数据存储接口的数据存储都可能会遇到冲突-例如,它们都使用
int
来识别用户,现在我们必须通过一个复杂的解决过程来为冲突的数据存储选择新ID,并相应地更新所有引用

在SQL中使用标准uniqueidentifier(带newid())作为主键的缺点是GUID不是顺序的,因此创建新行时,它们会插入到物理数据库页面中的任意位置,而不是追加到末尾。这会导致具有较大插入率的系统出现严重的页面碎片。可以改为使用newsequentialid()进行更正。我在一次会议上讨论了这个问题


一般来说,它的最佳实践是对GUID主键使用newsequentialid(),或者不对主键使用GUID。您总是可以有一个存储GUID的二级索引列,您可以使用它来保持引用的唯一性。

GUID作为主键在某些程序员群体中非常流行,他们并不真正(不想或不知道)关心他们的基础数据库

guid很酷,因为它们(几乎)保证是唯一的,你可以用.NET代码在客户端应用程序上“提前”创建它们

不幸的是,当涉及到SQL Server时,这些人并没有意识到这些选择的可怕的缺点(可怕的索引碎片和性能损失)。很多程序员真的一点都不在乎。。。。。然后责怪SQL Server太慢了

如果您想为主键使用guid(正如Rex M.所指出的,它们确实有一些非常好的用途,主要是在复制场景中),那么可以,但请确保在SQL Server中使用INT-IDENTITY列作为集群键,以最大限度地减少索引碎片,从而降低性能损失

“SQL Server索引女王”金伯利·特里普(Kimberly Tripp)在这一主题上发表了一系列非常好和有见地的文章——请参阅我的一些最爱:


基本上,她发布的任何内容都值得一读。

感谢您的回复,所以如果我使用内置的asp.net身份验证,它是否将newsequentialid()作为标准?我不明白为什么你永远都不想使用这个?@optician它不想,但请查看此链接以更改它: