EFCore学习笔记 - 主键
1、自增主键
-
简单, 但是不满足分布式, 并发性能差
-
long
、int
等类型主键, 默认为自增 -
自增字段的代码中不能为
Id
赋值, 必须保持默认值0, 否则运行的时候就会报错 -
因为是数据库生成的值, 所以
SaveChanges()
后会自动把主键的值更新到Id
-
例子: 插入帖子后, 自动重定向帖子地址
-
var b = new Blog{ Title: "aaa"};
ctx.Blogs.add(b);
await ctx.SaveChangesAsync();
2、Guid
-
又称
UUID
, 生成全局唯一的Id
, 适用于分布式系统, 在进行多数据库合并的时候很简单 -
简单, 高并发, 全局唯一, 无需锁机制, 但是磁盘空间占用大
-
不连续, 使用
Guid
作为主键, 不能把主键设置为聚集索引-
因为聚集索引是按照顺序保存主键的, 因此用
Guid
性能差 -
比如
MySQL
的InnoDB
引擎中主键是强制使用聚集索引的 -
有的数据库支持部分的连续
Guid
, 比如SQL Server
的NewSequentialId()
, 但也不能解决问题
-
-
在
SQL Server
中, 不要把Guid主键设置为聚集索引 -
在
MySQL
中, 频繁插入的表不要用Guid
作为主键
3、混合
-
用自增列做物理的主键, 而用
Guid
做逻辑上的主键-
把自增列设为表的主键, 而在业务上查询数据的时候, 把
Guid
当作主键用 -
在和其他表关联以及和外部系统通讯的时候, 比如前端显示数据表示的时候, 都用
Guid
列
-
-
不仅保证性能, 而且利用
Guid
的优点, 减轻列主键自增性导致主键值可以被预测带来的安全问题
4、Hi/Lo
-
EF Core
支持Hi/Lo
算法来优化自增列 -
主键由两个部分组成
-
高位
Hi
-
由数据库生成
-
两个高位之间间隔若干个值, 不同进程或者集群中不同服务器获取的
Hi
值不会重复
-
-
低位
Lo
:-
由程序在本地自增生成
-
本地进程计算的
Lo
可以保证在本地高效率的生成主键值
-
-
-
不是
EF Core