【问题标题】:asp.net core identity - Id column is nvarchar(450) - why?asp.net 核心标识 - Id 列是 nvarchar(450) - 为什么?
【发布时间】:2018-03-25 18:54:22
【问题描述】:

在 ASP.NET Core Identity 使用的 dbo.AspNetUsers 表中,Id 列定义为 nvarchar(450),如下图所示。

这是什么原因,因为指南存储在此列中?如果我要创建一个引用此 Id 列的外键,我真的不想使该列变得不必要地大。或者是否存在需要这种大小的Id 列的情况?

【问题讨论】:

  • 3 年后,没有人知道为什么我们继续使用比 varchar(36) 更昂贵的 nvachar(450) 来作为我们的 guid...

标签: asp.net-core-2.0 asp.net-core-identity


【解决方案1】:

我不知道为什么它的长度是 450,但这实际上并不重要。 NVARCHAR 类型是动态调整大小的,因此输入的数字实际上是 最大长度。它只会消耗存储它所存储的数据所需的字节量,而不管“长度”如何。

【讨论】:

  • 谢谢。我意识到您可以更改列类型 (docs.microsoft.com/en-us/aspnet/core/security/authentication/…)。您是否建议将标识符更改为 Int?从性能(以及大小)的角度来看,我认为使用字符串作为主键不是一个好主意。
  • 其实没那么重要。它仍然是一个索引列,因此查询的效率并不比 int PK 低。一个 int 占用的空间肯定更少,但是额外的几个字节可能不会影响数据库的总大小。我通常使用整数,但只是因为更喜欢使用数字“id”,不一定是出于性能或任何其他真正原因。
  • 这确实很重要!为 Identity 表创建默认迁移将导致 PK 在某些情况下 CAN 超过 900 字节的最大密钥长度。
  • 它可能会影响创建复合 PK。使用 AspNetUsers.Id 生成的任何复合键都将生成 Warning! The maximum key length for a clustered index is 900 bytes. 消息。我相信他们将 PK 大小设为 450 nvarchar,从而防止人们创建包含 Id 列的复合 PK。但这只是一个猜测。正如@ChrisPratt 所说,默认情况下 AspNetUsers.Id 是 GUID,所以你有它。
  • 他们不会用nvarchar(450) 来阻止人们创建涉及用户Id 的索引,因为他们自己在AspNetUserRoles.PK_AspNetUserRoles 中创建索引,即1800 字节:UserID+RoleId
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-19
  • 2020-01-07
  • 1970-01-01
  • 2017-07-17
  • 1970-01-01
  • 2020-02-27
  • 1970-01-01
相关资源
最近更新 更多