EFCore.Sharding配置详解:自定义分表规则与全局设置最佳实践
EFCore.Sharding配置详解自定义分表规则与全局设置最佳实践【免费下载链接】EFCore.ShardingDatabase Sharding For EFCore项目地址: https://gitcode.com/gh_mirrors/ef/EFCore.ShardingEFCore.Sharding是一款专为Entity Framework Core设计的数据库分表框架通过灵活的分表规则配置和全局设置帮助开发者轻松实现数据分片存储提升系统性能和可扩展性。无论是哈希取模分表还是按时间范围分表都能通过简单的API快速集成到现有项目中。分表规则核心概念与类型EFCore.Sharding提供两种主流分表策略通过ShardingRule类实现规则定义该类位于src/EFCore.Sharding/Primitives/ShardingRule.cs。哈希取模分表HashMod基于指定字段的哈希值进行取模运算将数据均匀分布到多个表中。适用于数据访问频率均匀、无明显时间规律的场景。核心参数包括ShardingField分表字段名如订单IDMod分表数量决定数据分布的表数量日期分表Date根据时间字段自动创建按时间范围划分的表如按日、按月。适用于具有明显时间序列特征的数据如日志、订单记录等。核心参数包括ExpandByDateMode时间粒度支持分钟、小时、日、月、年ShardingField日期类型的分表字段如创建时间自定义分表规则配置步骤1. 哈希取模分表配置通过IShardingBuilder的SetHashModSharding方法配置在启动时注册分表规则// 示例对Order实体按Id字段进行3表哈希分表 services.AddEFCoreSharding(config { config.SetHashModShardingOrder(nameof(Order.Id), 3); });上述代码会将Order表按Id字段的哈希值取模3分散到Order_0、Order_1、Order_2三个物理表中。实际项目中可参考examples/Demo.ModSharding/Program.cs的完整实现。2. 日期分表配置使用SetDateSharding方法配置时间范围分表支持指定起始时间和时间粒度// 示例对AuditLog按创建时间按月分表 var startTime new DateTime(2023, 1, 1); services.AddEFCoreSharding(config { config.SetDateShardingAuditLog( nameof(AuditLog.CreateTime), ExpandByDateMode.PerMonth, startTime ); });此配置会自动创建AuditLog_202301、AuditLog_202302等按月命名的物理表。详细示例可查看examples/Demo.DateSharding/Program.cs。高级分表规则多数据源与范围映射多数据源分表支持将不同范围的数据路由到不同数据源通过传入范围数组实现// 示例将Id 0-10000路由到SourceA10001-20000路由到SourceB config.SetHashModShardingOrder( nameof(Order.Id), 20000, (0, 10000, SourceA), (10001, 20000, SourceB) );时间范围映射对日期分表也支持多数据源配置不同时间段的数据存储到不同数据库// 示例2023年数据存储到Year2023库2024年数据存储到Year2024库 config.SetDateShardingAuditLog( nameof(AuditLog.CreateTime), ExpandByDateMode.PerYear, (new DateTime(2023, 1, 1), new DateTime(2024, 1, 1), Year2023), (new DateTime(2024, 1, 1), DateTime.MaxValue, Year2024) );全局设置最佳实践1. 基础配置项通过IShardingBuilder接口提供丰富的全局设置核心配置包括方法作用示例SetCommandTimeout设置SQL命令超时时间SetCommandTimeout(30)MigrationsWithoutForeignKey迁移时忽略外键MigrationsWithoutForeignKey()CreateShardingTableOnStarting启动时自动创建分表CreateShardingTableOnStarting(true)EnableShardingMigration启用分表迁移支持EnableShardingMigration(true)2. 逻辑删除配置通过UseLogicDelete启用逻辑删除功能自动过滤已删除数据// 示例配置逻辑删除字段 config.UseLogicDelete( keyField: Id, // 主键字段名 deletedField: IsDeleted // 逻辑删除标记字段 );3. 数据源配置支持读写分离和多数据源配置通过UseDatabase或AddDataSource方法注册数据源// 示例配置主从分离数据源 config.UseDatabase( new[] { (主库连接字符串, ReadWriteType.Write), (从库1连接字符串, ReadWriteType.Read), (从库2连接字符串, ReadWriteType.Read) }, DatabaseType.SqlServer );常见问题与解决方案分表字段选择原则哈希分表选择分布均匀的字段如自增ID、用户ID日期分表必须使用DateTime类型字段建议选择数据写入的时间戳分表数量规划哈希分表建议根据预估数据量设置一般每个物理表控制在1000万行以内日期分表根据数据增长速度选择合适粒度如日志表按日分表订单表按月分表已有数据迁移对于历史数据迁移可使用src/EFCore.Sharding/Migrations/MigrationHelper.cs提供的工具类实现数据平滑迁移到分表结构。配置示例完整启动流程以下是一个包含分表规则和全局设置的完整配置示例var services new ServiceCollection(); services.AddEFCoreSharding(config { // 全局设置 config.SetCommandTimeout(30) .CreateShardingTableOnStarting(true) .EnableShardingMigration(true); // 分表规则配置 config.SetHashModShardingOrder(nameof(Order.Id), 10) .SetDateShardingOrderLog( nameof(OrderLog.CreateTime), ExpandByDateMode.PerDay, new DateTime(2023, 1, 1) ); // 数据源配置 config.UseDatabase(连接字符串, DatabaseType.SqlServer); });通过以上配置EFCore.Sharding将自动处理分表逻辑开发者无需关心底层物理表结构直接通过EF Core的常规API操作即可。更多配置细节可参考项目中的示例代码和src/EFCore.Sharding/DependencyInjection/IShardingBuilder.cs接口定义。【免费下载链接】EFCore.ShardingDatabase Sharding For EFCore项目地址: https://gitcode.com/gh_mirrors/ef/EFCore.Sharding创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考