为什么aspnet_users使用guid作为id而不是递增int?有关扩展用户字段的帮助的奖励积分

Chr*_*rry 6 asp.net authentication guid uniqueidentifier

为什么aspnet_users使用guid作为id而不是递增int?

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

我也将开始使用此id来匹配扩展的详细信息表以获取额外的用户prefs等.我还在考虑使用带有guid和int的链接表,但我决定,因为我不认为我实际上需要将用户ID作为public int.

虽然我想有int(感觉更容易做用户查找等stackoverflow.com/users/12345/user-name),因为我只是要有用户名,我不认为我需要携带这个当我需要找到一个用户int时,周围的项目并且会增加查找的额外复杂性.

感谢您对此任何帮助.

Rex*_*x M 13

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

在SQL中使用标准uniqueidentifier(使用newid())作为主键的缺点是GUID不是顺序的,因此创建新行时它们会插入物理数据库页面中的某个任意位置,而不是附加到结束.这会导致具有任何实质插入率的系统出现严重的页面碎片.可以使用newsequentialid()来纠正它.我在这里更详细地讨论了这一点.

通常,最佳做法是将newsequentialid()用于GUID主键,或者仅使用GUID作为主键.您始终可以拥有存储GUID的辅助索引列,您可以使用该列来保持引用的唯一性.


mar*_*c_s 5

GUID作为主键非常受某些程序员群体的欢迎,他们并不真正(不想或不想知道)关心他们的底层数据库.

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

不幸的是,当谈到SQL Server时,那些人并没有意识到这些选择的可怕缺点(可怕的索引碎片,从而导致性能损失).很多程序员真的只是不关心一点.....然后责怪SQL Server因为狗的速度慢.

如果你想为你的主键使用GUID(并且它们确实有一些非常好的用途,正如Rex M.所指出的那样 - 主要是在复制方案中),那么确定,但确保使用INT IDENTITY列作为您的群集密钥SQL Server最小化索引碎片,从而最大限度地降低性能.

Kimberly Tripp,"SQL Server索引的女王",有一些关于这个主题的非常好的和富有洞察力的文章 - 看看我最喜欢的一些:

基本上她在博客上发表的任何内容都值得一读.