我正在使用ASP.NET MVC 5 Identity。我首先允许EF代码为我创建数据库表。 PasswordHash,SecurityStamp和PhoneNumber都是nvarchar(MAX) - 但是当我看他们的内容时,他们的内容要短得多。
对于我的主DAL,我使用的是Dapper - 虽然我让EF处理身份。
出于数据库性能的原因,我能够缩短这些MAX字段,同时保证身份仍能正常运行 - 如果是这样,那么长度是多少?
(我假设我可以用PhoneNumber做任何我喜欢的事情,因为我控制了该字段的内容 - 但我不太确定其他2)。
我找不到任何在线提及的内容。
答案 0 :(得分:0)
我不确定它对性能有多大帮助,但您可以使用流畅的API配置您的Identity属性:
public class YourContext : IdentityDbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//Make you you do this BEFORE the code below
base.OnModelCreating(modelBuilder);
//Assuming your user class is called "User" here:
modelBuilder.Entity<User>()
.Property(e => e.PasswordHash).HasMaxLength(100);
}
}
请注意,如果您使这些字段与Identity框架要插入的值不兼容,那么您将遇到问题。所以我建议最大长度的值很大。
答案 1 :(得分:0)
SQL Server的差异(我假设这是您使用的)性能给定nvarchar(x)vs nvarchar(Max)是在这些字段上进行搜索时。即select * from users where phoneNumber='123456789'
。
但是您提到的字段在标准身份模板的任何位置都不受where
子句的约束。甚至不是SecurityStamp
,绝对不是PasswordHash
。通过电子邮件,用户名,ID搜索用户。而且这些已经有限了 - 256个字符(see source,滚动到OnModelCreating
)。在UserName
列上应用索引。
因此,您所谈论的任何性能原因都不存在。
如果您通过电子邮件进行大量查询,则可以在Email
列上应用索引 - 这就像您可以获得性能一样多。电话号码也是如此 - 如果您通过电话号码查找用户,那么制作有限长度的列并应用索引是有意义的。