如标题所述,我想知道为什么ASP.NET Identity 2.0在用户表中使用GUID字符串作为主聚集键。相比整数ID,这有什么好处吗?我只看到一个问题,就是GUID不是最好的聚集索引选择。
我是否遗漏了什么,还是整数仍然是更好的选择?
如标题所述,我想知道为什么ASP.NET Identity 2.0在用户表中使用GUID字符串作为主聚集键。相比整数ID,这有什么好处吗?我只看到一个问题,就是GUID不是最好的聚集索引选择。
我是否遗漏了什么,还是整数仍然是更好的选择?
关于性能问题,我建议你参考此帖子,其中被接受的答案说:
GUID可能似乎是作为主键的自然选择 - 如果你确实必须这样做,那么你可能会争辩说要将其用作表的主键。但我强烈建议不要将GUID列用作聚集键,SQL Server默认情况下会这样做,除非你明确告诉它不要这样做。
你真的需要将两个问题分开:
- 主键是一个逻辑构造 - 候选键之一,可以唯一可靠地标识表中的每一行。这可以是任何东西 - INT,GUID,字符串 - 选择对你的场景最有意义的。
- 聚集键(定义表上“聚集索引”的列) - 这是与物理存储相关的事情,在这里,小型,稳定,不断增长的数据类型是您最好的选择 - INT或BIGINT作为默认选项。
这完全证实了你的印象。
其他回答都很好,但是我没有看到提到的一个好处是,Guid.NewGuid()
(理论上)创建一个唯一的ID,而不需要将行提交到数据库。
基于整数的标识列需要刷新数据库才能获得其ID。在某些情况下,有用的是在代码中生成PK并传递给数据库(显然,还有其他方法可以通过唯一约束实现这一点,但使用Guid是一个相当不错的选择)。
有时候,将Guid作为UserId(即主键)可能是您最好的选择。
当人们抱怨Guid时,需要考虑的一点是,他们可能没有考虑到“偶尔连接”应用程序。在这种情况下,您无法访问数据库以获取您的“int”身份字段值,但需要在离线情况下创建多个记录并将它们链接到各种表中。使用Guid允许应用程序创建一个“用户”,因此“userId”成为主键,在在线时进行同步而不会发生冲突。
为了避免性能问题,不要将Guid放入群集索引中。您可以始终使用不同的唯一字段作为群集id,或者甚至使用递增的整数身份字段作为“clusterId”,然后使用该字段。
另一个原因是当您从许多不同的源汇总数据时,如果UserId(主键)是Guid,则可以避免冲突。
我猜你所说的“to an id”指的是顺序整数ID,因为UUID毕竟也是一种ID。
如果绝对没有人使用Identity 2.0或将来的版本想要合并,或者组合多个存储区,或者导入用户和/或角色,则数字ID将起作用。
如果只有少数人这样做,甚至可能这样做,那么UUID就更有意义。
有人主张使用自然键(例如用户名),其优缺点已经得到了广泛探讨。我记得第一次确实是这样做的。
总体而言,UUID似乎是一个明显的选择。