首页 > 其他分享 >EFCore学习笔记 - 主键

EFCore学习笔记 - 主键

时间:2023-10-18 19:23:08浏览次数:38  
标签:Lo 笔记 增列 索引 Hi EFCore Guid 主键

主键

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的标准

标签:Lo,笔记,增列,索引,Hi,EFCore,Guid,主键
From: https://www.cnblogs.com/phonk/p/17773141.html

相关文章

  • EF Core学习笔记 - 配置
    约定配置1、主要规则表名采用DbContext中对应的DbSet的属性名数据表列的名字采用实体类属性的名字,列的数据类型采用喝实体类属性类型最兼容的类型,可以自定义设置数据表列的可空性取决于对应实体类属性的可空性名字为Id的属性为主键如果主键为short,int或者lo......
  • 2023/10/18 学习笔记
    VLAN网络vlan——虚拟局域网由于交换机所有的端口都在同一个广播域,只要发送广播会产生大量的垃圾信息,同时会有安全隐患(病毒)。解决这个问题有两种方法:物理解决:需要在交换机之间安装路由器(成本太大)逻辑解决:使用vlan虚拟网络技术vlan的优势:控制广播增强网络安全......
  • 【笔记】数据库、网络故障与恢复
    【笔记】数据库故障与恢复数据库故障主要分:事务故障、系统故障和介质故障事务故障是指事务在运行至正常终点前被终止,此时数据库可能出现不正确的状态。是由于事务程序内部错误而引起的,有些可以预期,如金额不足等,有些不可以预期,如非法输入、运算溢出等。类似于手动执行回滚恢......
  • Internet-augmented language models through few-shot prompting for open-domain qu
    Internet-augmentedlanguagemodelsthroughfew-shotpromptingforopen-domainquestionanswering 其实我没怎么正经读过论文,尤其是带实验的,我目前认真读过的(大部头)也就是一些LLM的综述。记录这个文档主要是防止自己读着读着玩手机去了/注意力不集中了跑路了/没记录困惑导......
  • TS 踩坑笔记: 箭头函数添加泛型报错(Error: JSX element ‘T’ has no corresponding
    前言今天给大家分享一个在React项目中使用TypeScript遇到的错误项目背景React+TS的项目配置,项目中关于React组件的使用.tsx后缀,其他单纯的文件使用.ts后缀问题描述在React组件附近定义泛型的箭头函数时产生TS报错警告,原本以为是语法写错了但是实际上在.t......
  • 《代码大全》阅读笔记02
    1、以解决问题为导向不仅仅是要完成一个任务;一切的一切都以实际的问题和需求为导向,最终的目的只有一个,而不是一直变换目标,就是解决真正的问题;2、把程序员当人看我们在项目中要记得,这是一个项目团队,团队由不同的个体组成,总是需要磨合的,所以,这就需要我们不仅仅将成员当人看,也要......
  • [vue]精宏技术部试用期学习笔记 II
    精宏技术部试用期学习笔记(vue)router:vue的模拟路由前置准备安装vue-routerpnpmivue-router@4//安装版本4的vue-router可以在package.json文件中查看依赖"dependencies":{"vue":"^3.3.4","vue-router":"4"//这里},新建文件夹/src......
  • C++模板笔记
    参考文章:https://juejin.cn/post/7078530622527897631模板是C++的泛型编程机制,这种机制可以最大程度复用代码并且不会增加运行时开销模板分为函数模板和类模板函数模板函数模板是对函数的参数进行泛型化,传递给模板函数的类型实参可以是类,也可以是整型值,还可以是模板名比如://......
  • [vue]精宏技术部试用期学习笔记 I
    精宏技术部试用期学习笔记(vue)什么是vue?我个人对vue的理解是把html\css\js三件套融合起来的结构,同时用组件化的思维把一个页面装填起来同时让页面形成树状结构优点是方便多人员维护提高代码复用性如何创建一个vue项目?我这里使用的是vite+vue的轻量化项目,使用pnpm......
  • 基本技巧——分数规划 学习笔记
    基本技巧——分数规划学习笔记引入分数规划用来求一个分式的极值。具体的,给定\(n\)个元素,每个元素有属性\(a_i,b_i\),求一个集合\(P\in[1,n]\),最大/最小化比率:$$\dfrac{\sum_{i\inP}a_i}{\sum_{i\inP}b_i}$$求解二分法假设我们要求最大值(求最小值的方法和求最大值的方......