news 2026/7/26 13:29:54

EFCore.Sharding配置详解:自定义分表规则与全局设置最佳实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
EFCore.Sharding配置详解:自定义分表规则与全局设置最佳实践

EFCore.Sharding配置详解:自定义分表规则与全局设置最佳实践

【免费下载链接】EFCore.ShardingDatabase Sharding For EFCore项目地址: https://gitcode.com/gh_mirrors/ef/EFCore.Sharding

EFCore.Sharding是一款专为Entity Framework Core设计的数据库分表框架,通过灵活的分表规则配置和全局设置,帮助开发者轻松实现数据分片存储,提升系统性能和可扩展性。无论是哈希取模分表还是按时间范围分表,都能通过简单的API快速集成到现有项目中。

分表规则核心概念与类型

EFCore.Sharding提供两种主流分表策略,通过ShardingRule类实现规则定义,该类位于src/EFCore.Sharding/Primitives/ShardingRule.cs。

哈希取模分表(HashMod)

基于指定字段的哈希值进行取模运算,将数据均匀分布到多个表中。适用于数据访问频率均匀、无明显时间规律的场景。核心参数包括:

  • ShardingField:分表字段名(如订单ID)
  • Mod:分表数量,决定数据分布的表数量

日期分表(Date)

根据时间字段自动创建按时间范围划分的表(如按日、按月)。适用于具有明显时间序列特征的数据,如日志、订单记录等。核心参数包括:

  • ExpandByDateMode:时间粒度(支持分钟、小时、日、月、年)
  • ShardingField:日期类型的分表字段(如创建时间)

自定义分表规则配置步骤

1. 哈希取模分表配置

通过IShardingBuilderSetHashModSharding方法配置,在启动时注册分表规则:

// 示例:对Order实体按Id字段进行3表哈希分表 services.AddEFCoreSharding(config => { config.SetHashModSharding<Order>(nameof(Order.Id), 3); });

上述代码会将Order表按Id字段的哈希值取模3,分散到Order_0Order_1Order_2三个物理表中。实际项目中可参考examples/Demo.ModSharding/Program.cs的完整实现。

2. 日期分表配置

使用SetDateSharding方法配置时间范围分表,支持指定起始时间和时间粒度:

// 示例:对AuditLog按创建时间按月分表 var startTime = new DateTime(2023, 1, 1); services.AddEFCoreSharding(config => { config.SetDateSharding<AuditLog>( nameof(AuditLog.CreateTime), ExpandByDateMode.PerMonth, startTime ); });

此配置会自动创建AuditLog_202301AuditLog_202302等按月命名的物理表。详细示例可查看examples/Demo.DateSharding/Program.cs。

高级分表规则:多数据源与范围映射

多数据源分表

支持将不同范围的数据路由到不同数据源,通过传入范围数组实现:

// 示例:将Id 0-10000路由到SourceA,10001-20000路由到SourceB config.SetHashModSharding<Order>( nameof(Order.Id), 20000, (0, 10000, "SourceA"), (10001, 20000, "SourceB") );

时间范围映射

对日期分表也支持多数据源配置,不同时间段的数据存储到不同数据库:

// 示例:2023年数据存储到Year2023库,2024年数据存储到Year2024库 config.SetDateSharding<AuditLog>( 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. 数据源配置

支持读写分离和多数据源配置,通过UseDatabaseAddDataSource方法注册数据源:

// 示例:配置主从分离数据源 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.SetHashModSharding<Order>(nameof(Order.Id), 10) .SetDateSharding<OrderLog>( 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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/26 13:28:54

如何快速打造ESP32智能小车:新手完全实战指南

如何快速打造ESP32智能小车&#xff1a;新手完全实战指南 【免费下载链接】arduino-esp32 Arduino core for the ESP32 family of SoCs 项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32 还在为复杂的机器人项目望而却步&#xff1f;想要亲手制作智能小…

作者头像 李华
网站建设 2026/7/26 13:28:07

libmatoya 加密与安全模块使用详解:保护应用数据的实用方法

libmatoya 加密与安全模块使用详解&#xff1a;保护应用数据的实用方法 【免费下载链接】libmatoya Cross-platform application development. 项目地址: https://gitcode.com/gh_mirrors/li/libmatoya libmatoya 作为跨平台应用开发框架&#xff0c;提供了强大的加密与…

作者头像 李华
网站建设 2026/7/26 13:27:40

基于YOLO的智能停车检测系统设计与优化

1. 项目背景与核心价值 停车难问题一直是城市管理中的痛点。传统停车场依赖人工引导或简单的传感器检测&#xff0c;不仅效率低下&#xff0c;还容易因人为因素导致车位利用率不高。我在参与多个智慧园区项目时发现&#xff0c;基于计算机视觉的智能停车检测方案能显著提升车位…

作者头像 李华
网站建设 2026/7/26 13:27:04

终极Linux打印机驱动解决方案:foo2zjs让100+款打印机完美工作

终极Linux打印机驱动解决方案&#xff1a;foo2zjs让100款打印机完美工作 【免费下载链接】foo2zjs A linux printer driver for QPDL protocol - copy of http://foo2zjs.rkkda.com/ 项目地址: https://gitcode.com/gh_mirrors/fo/foo2zjs 你是否曾经为Linux系统找不到合…

作者头像 李华
网站建设 2026/7/26 13:25:42

TinyML模型长期稳定性测试框架与优化实践

1. 项目背景与核心价值 在智能家居和工业物联网场景中&#xff0c;我们经常遇到一个典型矛盾&#xff1a;部署在终端设备上的微型机器学习模型&#xff08;TinyML&#xff09;初期测试表现良好&#xff0c;但运行数月后会出现准确率下降、内存泄漏甚至系统崩溃的情况。去年我们…

作者头像 李华