C# 为什么ASP.NET Identity 2.0使用GUID/字符串作为用户id?
正如标题所说,我想知道为什么ASP.NET Identity 2.0使用带有GUID的字符串作为用户表的主聚集键。这对整数id有什么好处吗?我只看到了一个问题,GUID不是聚集索引的最佳选择C# 为什么ASP.NET Identity 2.0使用GUID/字符串作为用户id?,c#,asp.net,asp.net-identity,C#,Asp.net,Asp.net Identity,正如标题所说,我想知道为什么ASP.NET Identity 2.0使用带有GUID的字符串作为用户表的主聚集键。这对整数id有什么好处吗?我只看到了一个问题,GUID不是聚集索引的最佳选择 我是否遗漏了什么或者整数仍然是更好的选择?关于guid的使用,有一种观点提倡使用没有“意义”的ID,以便将标识符与其周围的数据完全分开;此id不应在数据存储外部可见。如果我们看一看a的一些特征,我们有以下几点 该值在整个系统范围内是唯一的,因此从不重复使用 该值由系统生成 用户或应用程序无法操作该值 该值
我是否遗漏了什么或者整数仍然是更好的选择?关于guid的使用,有一种观点提倡使用没有“意义”的ID,以便将标识符与其周围的数据完全分开;此id不应在数据存储外部可见。如果我们看一看a的一些特征,我们有以下几点
- 该值在整个系统范围内是唯一的,因此从不重复使用
- 该值由系统生成
- 用户或应用程序无法操作该值
- 该值不包含语义含义
- 该值对用户或应用程序不可见
- 该值不是由来自不同域的多个值组成的
关于绩效,我想告诉你,公认的答案是: guid似乎是主键的自然选择,如果 你真的必须,你可能会争论把它用于初选 表的键。我强烈建议不要使用 GUID列作为群集键,默认情况下SQL Server会这样做, 除非你明确告诉它不要 您确实需要将两个问题分开:
- 主键是一个逻辑结构—唯一且可靠地标识表中每一行的候选键之一。这 可以是任何东西,真的-一个INT,一个GUID,一个字符串-选择什么使 最适合您的场景
- 集群键(表上定义“集群索引”的一列或多列)-这是与物理存储相关的 在这里,一个小的、稳定的、不断增加的数据类型是您的 最好选择-INT或BIGINT作为默认选项
总之,UUID似乎是一个明显的选择。其他答案都很好,但是我没有提到的一个优点是,
Guid.NewGuid()
(理论上)在不将行提交到数据库的情况下创建唯一的ID
基于整数的标识列需要数据库刷新才能获取其ID。在某些情况下,在代码中生成行的PK并将其传递给数据库是很有用的(显然,有其他方法可以通过唯一约束实现这一点,但Guid是一个相当好的选择)与往常一样,微软更看重的是“简单性”,而不是实用性和性能。是的GUID是系统范围内唯一的,是的,您可以在不刷新数据库中的新ID的情况下对其进行测试…但是 我甚至不打算讨论DB索引,我相信很多人都想到了。这是字符串的另一个缺点。即使我在数据库中使用BIGINT作为用户标识,与varchar(128)相比仍然只有8个字节。我知道现在磁盘空间很便宜,但为什么我要用不必要的东西把数据库弄得乱七八糟呢。任何曾经参与过涉及数百万用户的项目的人都会反对将字符串作为他们的用户ID。微软关于“为什么使用字符串”的所有回答基本上都是拒绝回答 当然,他们会说:“你可以把它改成使用int、bigint等等……”当然,你必须改变无数的类,实现你自己的用户存储等等。对……如此简单的事情必须如此复杂 /end rant作为用户ID的Guid(因此主键)有时可能是您最好的朋友
当人们对GUID“咆哮”时要考虑的是,它们可能不考虑“偶尔连接”的应用程序,因此,在重新连接之前,不能访问数据库以获得“int”标识字段值,但需要在脱机链接的各种表中创建多个记录。拥有Guid允许应用程序创建一个“用户”,因此当您重新联机进行同步时,“用户ID”作为主键不会发生冲突
为了避免性能问题,不要将Guid放在集群索引中。您可以始终使用不同的唯一字段作为集群id,或者甚至可以使用增加1的整数标识字段作为“集群id”,并使用该字段另一个原因是,当您聚合来自多个不同来源的数据时,如果用户ID(主键)是Guid,则可以避免冲突。Microsoft总是为主键选择Guid,这是正确的,因为它不是群集键中最快的,但微软似乎很喜欢它们——因为它们是创建它们的人——你可以看看这个答案:事实上,这是我链接的文章中代理键的一个优点——它可以在数据库之外确定(这是说它是系统生成的另一种方式)。但是,也可以在DB之外生成int值;使guid具有优势的是它的唯一性+1比我简洁得多:DIt