sql-server - Asp.net 身份:为什么索引在 GUID (nvarchar) 上?使用 int 有什么好处/缺点?
问题描述
当我使用 Visual Studio 2017 生成 MVC.NET 时,它会生成一些表 AspNetUsers、AspNetRoles 等...
如果查看已生成的Id,都在 nvarchar(128) 中,并且值只是 GUID。
我的直接反应是将其更改为 int,但我认为 Microsoft 必须有一个很好的理由使用 GUID 而不是 int。但是用谷歌搜索,我找不到答案。
现在,我明白了为什么它将所有 id 存储为 nvarchar(128),这是因为并非所有数据库都具有字段类型 GUID。但我找不到使用 GUID 和 int 的好处。
进一步搜索互联网,我发现了这篇文章:GUIDs as PRIMARY KEYs and/or the clustering key。现在,听起来 GUID 可能是一个糟糕的选择。
我还处于早期阶段,所以我仍然是时候从 GUID 更改为 int。但是使用 int 而不是 GUID有什么真正的缺点(和/或好处)吗?
谢谢你的帮助...
解决方案
网上已经有很多关于这个问题的讨论。这确实是一个永无止境的辩论/话题,因为两者int/long
和GUID
主键都有优点和缺点。
GUID vs INT Debate是一篇关于这个主题的精彩文章。
您还可以查看为什么 ASP.NET Identity 2.0 使用 GUID/字符串作为用户 ID?
除了这些文章讨论之外,我还可以向您提出一些建议:
默认情况下,SQL Server 主键是集群键,除非您明确告诉它不要这样做,否则在
GUID
主键的情况下会导致性能不佳。如果您考虑到这一点,则不要选择GUID
作为主键。如果您认为您的主键不是唯一标识符就没有特殊含义,请选择
GUID
作为主键。如果您需要有意义且可读的主键,请选择
int/long
作为主键。
如果您选择GUID
作为主键,那么您可以查看使用 GUID 作为主键的最佳做法是什么,特别是在性能方面?
推荐阅读
- javascript - React-Redux:尝试分派将嵌套数组分配给另一个数组的操作时,挂钩调用无效
- javascript - 使用 puppeteer 作为半自动化系统
- ios - 从 ViewController 到 UILabel 的 currencyLabel 出口无效。插座无法连接到重复内容
- matlab - MATLAB中离散SIR模型的分岔图
- node.js - 在使用“For”时使用我的回调函数有问题吗?
- ios - 具有自调整大小的 UICollectionViewLayout 部分插入
- reactjs - 是否可以在 reactjs 中使用 windows 绝对路径加载图像
- python - 如何在不使用许多 if 语句的情况下将变量更改为不同的值 python
- ios - iOS Swift 函数 isDateInToday 在某些手机上不起作用
- php - WordPress 阻止重新提交表单