1、对聊天记录进行数据存取,但长年累月的消息数据都存储在同一个表内,累积的数据越来越多,数据读取的效率会受影响。
2、设计以CreateTime字段为分表依据,按CreateTime的月份数值进行分表,不同月份的数据存入不同的表内
3、建立接口,对要分表的实体模型进行字段约束,所有要分表的实体都必须具备该属性
public interface IMonthSeparatedModel { public DateTime CreateTime { get; set; } }
4、建立Message类,并实现接口中的必须具备属性,在各个属性上标注数据库中对应的数据类型,这样FreeSql在根据不同月份自动建表时,会依照指定的数据类型来创建(主要是字符串的长度需要指定清楚)
using FreeSql.DataAnnotations; [Table(Name = "Message")] public class Message: IMonthSeparatedModel { [Column(IsPrimary = true, DbType = "nvarchar(50)")] public string MessageId { get; set; } [Column(DbType = "nvarchar(50)")] public string From { get; set; } [Column(DbType = "nvarchar(max)")] public string ToList { get; set; } [Column(DbType = "nvarchar(50)")] public string MessageType { get; set; } [Column] public DateTime CreateTime { get; set; } }
5、借用FreeSql的AsTable方法,指定数据表进行增删查改操作
var fsBuider = new FreeSqlBuilder() .UseConnectionString(DataType.SqlServer, ConnectionString) .UseAutoSyncStructure(true) //根据实体类的结构,自动在数据库中同步表结构 .Build() // 查询Message_2021_09和Message_2021_08两张表 var list = await fsBuilder.Select<Message>() .AsTable((_, name) => $”{name}_2021_09”) .AsTable((_, name) => $”{name}_2021_09”) .ToListAsync();
6、当然也可以通过ToSql()方法来查看其运行的SQL语句
var sql = fsBuilder.Select<Message>() .AsTable((_, name) => $”{name}_2021_09”) .AsTable((_, name) => $”{name}_2021_09”) .ToSql(); //sql的值为 SELECT * from (SELECT a.[MessageId], a.[From], a.[ToList], a.[RoomId], a.[MessageType], a.[CreateTime] FROM [Message_2021_08] a ) ftb UNION ALL SELECT * from (SELECT a.[MessageId], a.[From], a.[ToList], a.[RoomId], a.[MessageType], a.[CreateTime] FROM [Message_2021_09] a ) ftb
7、总结了一个简单的demo,里面包含分表之后,常用的新增、删除、修改数据操作,也包含根据条件进行查询、分页等操作,并根据传入的时间范围自动进行AsTable()的拼接,详见附件