校方提出需求如下:
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 |
缺点:每一个查询都要带上学期,一个表包含多条编号相同的记录,表之间的关系如何建立。学期增加,数据库容量巨增。