Go to file
xuejmnet 2bb8ce73a1 更新文档添加金额表尝试针对join使用 2021-02-01 21:46:11 +08:00
samples/Sample.SqlServer 修改readme并且提供默认路由 2021-01-27 13:38:30 +08:00
src 更新文档添加金额表尝试针对join使用 2021-02-01 21:46:11 +08:00
src2x 修复sqlserver依赖注入bug 2021-02-01 08:16:28 +08:00
src3x fix name space 2021-01-26 16:43:47 +08:00
test 更新文档添加金额表尝试针对join使用 2021-02-01 21:46:11 +08:00
.gitignore fix name space 2021-01-26 16:43:47 +08:00
Directory.Build.props 修改各版本命名空间和语言版本 2021-01-26 16:35:16 +08:00
LICENSE Initial commit 2021-01-26 09:32:36 +08:00
README.md 更新文档添加金额表尝试针对join使用 2021-02-01 21:46:11 +08:00
ShardingCore.sln 添加mysql单元测试 2021-01-26 17:28:00 +08:00
clear.bat 修改各版本命名空间和语言版本 2021-01-26 16:35:16 +08:00
nuget-publish.bat 修改各版本命名空间和语言版本 2021-01-26 16:35:16 +08:00

README.md

ShardingCore

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

依赖

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

Support Sharding Method 支持的分表方式

Support Any Method and Support Any ShardingKey not provide job but provider create table interface IShardingTableCreator simple job ChronusJob support cron expression

方法 Method Support ShardingKey Type
取模 Sharding Mod Yes Any ClrType
大数取模范围 Sharding Range Yes Any ClrType
按天/周/月/年... Sharding By Day/Week/Month/Year... Yes Any ClrType
其他 Sharding By Other Yes Any ClrType

开始

以下所有例子都以Sql Server为例

概念

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

  • [Tail] 尾巴、后缀物理表的后缀
  • [TailPrefix] 尾巴前缀虚拟表和物理表的后缀中间的字符
  • [物理表] 顾名思义就是数据库对应的实际表信息,表名( tablename + tailprefix + tail) IPhysicTable
  • [虚拟表] 虚拟表就是系统将所有的物理表在系统里面进行抽象的一个总表对应到程序就是一个entityIVirtualTable
  • [虚拟路由] 虚拟路由就是联系虚拟表和物理表的中间介质,虚拟表在整个程序中只有一份,那么程序如何知道要查询系统哪一张表呢,最简单的方式就是通过虚拟表对应的路由IVirtualRoute ,由于基本上所有的路由都是和业务逻辑相关的所以虚拟路由由用户自己实现,该框架提供一个高级抽象

安装

<PackageReference Include="ShardingCore.SqlServer" Version="5.0.0.1" />

配置

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


    public class SysUserRange:IShardingEntity
    {
        /// <summary>
        /// 分表分库range切分
        /// </summary>
        [ShardingKey(TailPrefix = "_",AutoCreateTableOnStart = true)]
        public string Id { get; set; }
        /// <summary>
        /// 姓名
        /// </summary>
        public string Name { get; set; }
        /// <summary>
        /// 年龄
        /// </summary>
        public int Age { get; set; }
    }
    
    public class SysUserRangeMap:IEntityTypeConfiguration<SysUserRange>
    {
        public void Configure(EntityTypeBuilder<SysUserRange> builder)
        {
            builder.HasKey(o => o.Id);
            builder.Property(o => o.Id).IsRequired().HasMaxLength(128);
            builder.Property(o => o.Name).HasMaxLength(128);
            builder.ToTable(nameof(SysUserRange));
        }
    }
    

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


    public class SysUserRangeVirtualRoute: AbstractShardingOperatorVirtualRoute<SysUserRange, string>
    {
        protected override string ConvertToShardingKey(object shardingKey);

        public override string ShardingKeyToTail(object shardingKey);

        public override List<string> GetAllTails();

        protected override Expression<Func<string, bool>> GetRouteToFilter(string shardingKey, ShardingOperatorEnum shardingOperator);
     }
  • ConvertToShardingKey 分表关键字段如何转换成对应的类型
  • ShardingKeyToTail 分表关键字段如何转换成对应的物理表后缀
  • GetAllTails 现在数据库已存在的尾巴有哪些
  • GetRouteToFilter 传入分表字段返回一个如何筛选尾巴的方法

Startup.cs 下的 ConfigureServices(IServiceCollection services)


  services.AddShardingSqlServer(o =>
  {
      o.ConnectionString = "Data Source=localhost;Initial Catalog=ShardingCoreDB;Integrated Security=True";
      o.AddSharding<SysUserRangeVirtualRoute>();
      o.CreateIfNotExists((provider, config) =>
      {
          config.EnsureCreated = true;
      });
  });

Startup.cs 下的 Configure(IApplicationBuilder app, IWebHostEnvironment env) 你也可以自行封装app.UseShardingCore()


            var shardingBootstrapper = app.ApplicationServices.GetRequiredService<IShardingBootstrapper>();
            shardingBootstrapper.Start();

使用

    
        private readonly IVirtualDbContext _virtualDbContext;

        public ctor(IVirtualDbContext virtualDbContext)
        {
            _virtualDbContext = virtualDbContext;
        }

        public async Task ToList_All()
        {
            var ranges=await _virtualDbContext.Set<SysUserRange>().ToShardingListAsync();
        }

Api

方法 Method SqlServer Unit Test MySql Unit Test
获取集合 ToShardingListAsync 8 8
第一条 ShardingFirstOrDefaultAsync 5 5
最大 ShardingMaxAsync 0 0
最小 ShardingMinAsync 0 0
是否存在 ShardingAnyAsync 0 0
分页 ToShardingPageResultAsync 0 0
数目 ShardingCountAsync 1 1
求和 ShardingSumAsync 0 0

默认路由

抽象abstract 路由规则 tail 索引
AbstractSimpleShardingModKeyIntVirtualRoute 取模 0,1,2... =
AbstractSimpleShardingModKeyStringVirtualRoute 取模 0,1,2... =
AbstractSimpleShardingDayKeyDateTimeVirtualRoute 按时间 yyyyMMdd >,>=,<,<=,=,contains
AbstractSimpleShardingDayKeyLongVirtualRoute 按时间戳 yyyyMMdd >,>=,<,<=,=,contains
AbstractSimpleShardingWeekKeyDateTimeVirtualRoute 按时间 yyyyMMdd_dd >,>=,<,<=,=,contains
AbstractSimpleShardingWeekKeyLongVirtualRoute 按时间戳 yyyyMMdd_dd >,>=,<,<=,=,contains
AbstractSimpleShardingMonthKeyDateTimeVirtualRoute 按时间 yyyyMM >,>=,<,<=,=,contains
AbstractSimpleShardingMonthKeyLongVirtualRoute 按时间戳 yyyyMM >,>=,<,<=,=,contains
AbstractSimpleShardingYearKeyDateTimeVirtualRoute 按时间 yyyy >,>=,<,<=,=,contains
AbstractSimpleShardingYearKeyLongVirtualRoute 按时间戳 yyyy >,>=,<,<=,=,contains

注:contains表示为o=>ids.contains(o.shardingkey)

#高级

##批量操作

批量操作将对应的dbcontext和数据进行分离由用户自己选择第三方框架比如zzz进行批量操作或者batchextension

 virtualDbContext.BulkInsert<SysUserMod>(new List<SysUserMod>())
.BatchGroups.ForEach(pair =>
{
    ///zzz or other
    pair.Key.BlukInsert(pair.Value);
});
var shardingBatchUpdateEntry = virtualDbContext.BulkUpdate<SysUserMod>(o => o.Id == "1", o => new SysUserMod()
{
Name = "name_01"
});
shardingBatchUpdateEntry.DbContexts.ForEach(context =>
{
//zzz or other
context.Where(shardingBatchUpdateEntry.Where).Update(shardingBatchUpdateEntry.UpdateExp);
});

最后

凭借各大开源生态圈提供的优秀代码和思路才有的这个框架,希望可以为.Net生态提供一份微薄之力,该框架本人会一直长期维护,有大神技术支持可以联系下方方式欢迎star :)

QQ群:771630778

个人QQ:326308290(欢迎技术支持提供您宝贵的意见)

个人邮箱:326308290@qq.com