学生成绩表的学生成绩是每天不断更新累加的结果,同时还需要按天显示学生的历史成绩走势图。如何设计表能够按天显示学生的成绩比较方便,数据量一般在几千左右,目前的做法是专门设计了一张历史表备份每天的成绩,用了windows服务每天凌晨备份,有更好的解决方法吗
能从本质上解决这个需求的方法是,根据每次成绩的更新数据设计一个增量更新表和对应的新增成绩模块,要求这个模块能在成绩发生更新时向外界广播成绩更新事件,可以使用分布式消息队列程序比如 RabbitMQ 或者 MediatR 这种进程内消息总线作为事件消息集散中心,同时数据表只记录每次更新变化的部分,这张表永远只会新增数据不会修改历史数据。
然后设计一个成绩统计模块和相应的统计表,能接收成绩更新事件并对学生成绩进行更新,当天的成绩修改记录,每天插入新记录并在插入数据时用前一天的记录为基础。
基本设计思想是事件驱动架构和事件溯源,这样可以确保数据完整性不会遭到破坏,同时任意复杂的统计都可以实时监控事件或以定时任务触发。因为增量更新表保存了最细粒度的原始数据,可以通过程序将学生成绩回滚到任意时间点。独立的统计表其核心目的只是缓存常用时间点的状态,避免实时统计造成应用服务器压力过大。
你可以搜索 事件驱动架构、事件溯源、命令查询职责分离 等来了解详细信息,这组思想衍生的架构对历史状态的追溯有天然支持,也有利于应用扩展。