基于efcore的分表组件开源

ShardingCore 是一个支持efcore 2.x 3.x 5.x的一个对于数据库分表的一个简易扩展,
目前该库暂未支持分库(未来会支持),仅支持分表,该项目的理念是让你可以已最少的代码量来实现自动分表的实现,经过多个开源项目的摸索参考目前正式开源本项目
项目地址 github 喜欢的朋友可以点下star Thanks♪(・ω・)ノ

依赖 Release EF Core .NET Standard .NET (Core) Sql Server Pomelo.EntityFrameworkCore.MySql
5.x.x.x   >= 5.0.x   2.1   3.0+   >= 2012   5.0.0-alpha.2  
3.x.x.x   3.1.10   2.0   2.0+   >= 2012   3.2.4  
2.x.x.x   2.2.6   2.0   2.0+   >= 2008   2.2.6  

开始

以下所有例子都以Sql Server为例 MySql亦如此

简介

目前该库处于初期阶段,有很多bug也希望各位多多理解,一起努力为.net生态做出一份微薄之力,目前该库支持的分页可以进行完全的自定义,基本上可以满足95%以上的
业务需求,唯一的限制就是分表规则必须满足 x+y+z,x表示固定的表名,y表示固定的表名和表后缀之间的联系(可以为空),z表示表后缀,可以按照你自己的任意业务逻辑进行切分,
如:user_0,user_1或者user202101,user202102...当然该库同样适用于多租户模式下的隔离,该库为了支持之后的分库已经重写了之前的union all查询模式,并且支持多种api,
支持多种查询包括join group by max count min avg sum ...等一系列查询,之后可能会添加更多支持,目前该库的使用非常简单,基本上就是针对IQueryable的扩展,为了保证
该库的简介目前仅使用该库无法或者说难以实现自动建表,但是只需要配合定时任务该库即可完成24小时无人看管自动管理。该库提供了 IShardingTableCreator
作为建表的依赖,如果需要可以参考 按天自动建表

概念

本库的几个简单的核心概念:

[Tail]
尾巴、后缀物理表的后缀

[TailPrefix]
尾巴前缀虚拟表和物理表的后缀中间的字符

[物理表]
顾名思义就是数据库对应的实际表信息,表名(tablename+ tailprefix+ tail) IPhysicTable

[虚拟表]
虚拟表就是系统将所有的物理表在系统里面进行抽象的一个总表对应到程序就是一个entityIVirtualTable

[虚拟路由]
虚拟路由就是联系虚拟表和物理表的中间介质,虚拟表在整个程序中只有一份,那么程序如何知道要查询系统哪一张表呢,最简单的方式就是通过虚拟表对应的路由IVirtualRoute
,由于基本上所有的路由都是和业务逻辑相关的所以虚拟路由由用户自己实现,该框架提供一个高级抽象

优点

[支持自定义分表规则]

[支持任意类型分表key]

[针对iqueryable的扩展方便使用]

[支持分表下的连表] join

[支持针对批处理的使用] BulkInsert、BulkUpdate、BulkDelete

[提供多种默认分表规则路由] 按时间按取模

[针对分页进行优化] 大页数跳转支持低内存流式处理

缺点

[暂不支持分库(不久后会支持)]

[消耗连接]出现分表与分表对象进行join如果条件没法索引到具体表会生成笛卡尔积导致连接数爆炸,后期会进行针对该情况的配置

[该库比较年轻] 可能会有一系列bug或者单元测试不到位的情况,但是只要你在群里或者提了issues我会尽快解决

安装 <PackageReference Include="ShardingCore.SqlServer" Version="5.0.0.3" /> 配置

配置entity 推荐 fluent api 可以实现自动建表功能
IShardingEntity数据库对象必须继承该接口
ShardingKey分表字段需要使用该特性

public class SysUserMod:IShardingEntity { /// <summary> /// 用户Id用于分表 /// </summary> [ShardingKey] public string Id { get; set; } /// <summary> /// 用户名称 /// </summary> public string Name { get; set; } /// <summary> /// 用户姓名 /// </summary> public int Age { get; set; } } public class SysUserModMap:IEntityTypeConfiguration<SysUserMod> { public void Configure(EntityTypeBuilder<SysUserMod> builder) { builder.HasKey(o => o.Id); builder.Property(o => o.Id).IsRequired().HasMaxLength(128); builder.Property(o => o.Name).HasMaxLength(128); builder.ToTable(nameof(SysUserMod)); } }

创建virtual route
实现 AbstractShardingOperatorVirtualRoute<T, TKey>
抽象,或者实现系统默认的虚拟路由
框架默认有提供几个简单的路由

public class SysUserModVirtualRoute : AbstractSimpleShardingModKeyStringVirtualRoute<SysUserMod> { public SysUserModVirtualRoute() : base(3) { } public override List<string> GetAllTails() { return new() { "0","1","2"}; } }

GetAllTails
现在数据库已存在的尾巴有哪些

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyfggg.html