EFCore学习笔记 - 主键

主键

1、自增主键

  • 简单, 但是不满足分布式, 并发性能差

  • longint等类型主键, 默认为自增

  • 自增字段的代码中不能为Id赋值, 必须保持默认值0, 否则运行的时候就会报错

  • 因为是数据库生成的值, 所以SaveChanges()后会自动把主键的值更新到Id

    • 例子: 插入帖子后, 自动重定向帖子地址

var b = new Blog{ Title: "aaa"};
ctx.Blogs.add(b);
await ctx.SaveChangesAsync();

2、Guid

  • 又称UUID, 生成全局唯一的Id, 适用于分布式系统, 在进行多数据库合并的时候很简单

  • 简单, 高并发, 全局唯一, 无需锁机制, 但是磁盘空间占用大

  • 不连续, 使用Guid作为主键, 不能把主键设置为聚集索引

    • 因为聚集索引是按照顺序保存主键的, 因此用Guid性能差

    • 比如MySQLInnoDB引擎中主键是强制使用聚集索引的

    • 有的数据库支持部分的连续Guid, 比如SQL ServerNewSequentialId(), 但也不能解决问题

  • SQL Server中, 不要把Guid主键设置为聚集索引

  • MySQL中, 频繁插入的表不要用Guid作为主键

3、混合

  • 自增列做物理的主键, 而Guid做逻辑上的主键

    • 自增列设为表的主键, 而在业务上查询数据的时候, 把Guid当作主键用

    • 在和其他表关联以及和外部系统通讯的时候, 比如前端显示数据表示的时候, 都用Guid

  • 不仅保证性能, 而且利用Guid的优点, 减轻列主键自增性导致主键值可以被预测带来的安全问题

4、Hi/Lo

  • EF Core支持Hi/Lo算法来优化自增列

  • 主键由两个部分组成

    • 高位Hi

      • 数据库生成

      • 两个高位之间间隔若干个值, 不同进程或者集群中不同服务器获取的Hi值不会重复

    • 低位Lo:

      • 由程序在本地自增生成

      • 本地进程计算的Lo 可以保证在本地高效率的生成主键值

  • 不是EF Core的标准

posted on 2023-10-18 19:17  老菜农  阅读(32)  评论(0编辑  收藏  举报

导航