1、对聊天记录进行数据存取,但长年累月的消息数据都存储在同一个表内,累积的数据越来越多,数据读取的效率会受影响。

数据库水平分表之前.png


2、设计以CreateTime字段为分表依据,按CreateTime的月份数值进行分表,不同月份的数据存入不同的表内

数据库水平分表之后09.png


数据库水平分表之后08.png


数据库水平分表之后07.png


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()的拼接,详见附件

FreeSqlTableSeparate.zip