高分求一方案: 保留历史数据
最近做一个学校管理系统,当中遇到一个比较麻烦的问题“保留历史数据”,很疑惑,说出来大家讨论下,相信很多人也遇到同样的问题。
校方提出需求如下:
1.要保留学期留历史数据
比如:
● 一年级一班2008-2009上学期有30个人,下学期有35个人,在查看上学期历史数据的时候只能显示上学期的30个人
● 某学生在上学期名叫“张三”,而下学期改名叫“张四”,在查看上学期历史数据的时候应显示“张三”
● 某教师在上学期可能任职“总务”,而下学期可能任职“主任”,在查看上学期历史数据的时候应显示教师当时的任职情况,即“总务”
2.能实现跨学期数据统计
而在统计分析中,要能实现在不同学期间实现统计,比如,可以统计2000年-2009年,某教师的考评情况,生成图表;可以统计学生从一年级到六年级的成绩,生成图表
有考虑过以下几种方案,但每种方案都有不足之处
1. 数据库分离
不同学期数据库独立,在学期交替的时候将数据备份到另一个数据库,作为历史数据保留,对现有数据的修改不会影响历史数据,去年叫“张三”的学生,今年改名“张四”,查看历史数据的时候,还是叫“张三”
优点:容易实现历史数据的保留,能实现不同学期数据绝对独立
缺点:跨学期统计,则需要跨数据库访问,不方便
2. 数据表分离
不同学期表独立,比如表 Students ,在学期交替时将数据备份至另一个表 "2008-2009 上 Students ",作为Students 2008-2009上学期历史数据保留
优点:跟方案1一样,容易实现历史数据的保留,能实现不同学期数据绝对独立,互不影响
缺点:随着学期的增加,数据库容量巨增;跨学期统计,需在多表之间统计,较方案1中跨数据库统计方便些,但也不方便;因为不同学期表名不同,和ORM的映射关系不容易处理。
3.在需要保留历史数据的每个表都加学期字段
一个表包含所有学期的数据,如Students:
学期 编号 姓名 成绩
2008-2009 上 01 张三 80
2008-2009 下 01 张四 90
2008-2009 下 02 李四 85
优点:能实现不同学期数据独立,跨学期统计数据很方便,在一个表内
缺点:每一个查询都要带上学期,一个表包含多条编号相同的记录,表之间的关系如何建立。学期增加,数据库容量巨增。
这几个方案中,目前不知道选哪个,或许还有更好的解决方案,欢迎讨论