高分求一方案: 保留历史数据

稍微有点无敌 2009-09-14 10:52:42
最近做一个学校管理系统,当中遇到一个比较麻烦的问题“保留历史数据”,很疑惑,说出来大家讨论下,相信很多人也遇到同样的问题。
校方提出需求如下:
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
优点:能实现不同学期数据独立,跨学期统计数据很方便,在一个表内
缺点:每一个查询都要带上学期,一个表包含多条编号相同的记录,表之间的关系如何建立。学期增加,数据库容量巨增。

这几个方案中,目前不知道选哪个,或许还有更好的解决方案,欢迎讨论
...全文
286 26 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
tsp3ng 2009-09-17
  • 打赏
  • 举报
回复
如果业务单据需要记录的历史很固定,就采用业务单据冗余(班次,姓名,职务). 保存单据时就把这些信息一起保存.
tsp3ng 2009-09-17
  • 打赏
  • 举报
回复
把需要记录历史信息的字段(班级,姓名,职务等)冗余在这个冻结表中.
类似表结构(年度,学期,班级,学生id, 姓名,职务)
业务表冗余年度,学期

或者
主表(表id, 年度, 学期)
明细表(表id, 学生id, 班级, 姓名)
业务表只要冗余表id 即可关联到历史表

要历史统计时根据冻结表查询. 一般不采取业务表直接冗余姓名, 班级, 职务, 这样会造成业务表无法扩展,
等到某一天,要显示历史职称就麻烦了.

xuejiecn 2009-09-17
  • 打赏
  • 举报
回复
如果有业务性质,那么就按单据类处理,把额外的信息放到这个表中就可以了。
班级情况,可以类似记录修改记录的,没有记录就是当前的记录的,因为大部分信息是不会变化的。
如果有,根据当前的情况倒推回去。
或者,在发生变化的时候,建立一个需要的相应表的副本,根据时间查询指定的副本。
haitao 2009-09-17
  • 打赏
  • 举报
回复
每天为每人的姓名、职务、所在班级、部门等信息做一个快照记录
这样,数据量大,但是以后的关联简单

或者

每人的姓名、职务、所在班级、部门等信息有变动时,才记录一条变更记录:日期,谁,原姓名、职务、所在班级、部门
这样,数据量小,但是以后的关联会比较麻烦,需要按日期找该人该日之后的第一条记录
realgz 2009-09-17
  • 打赏
  • 举报
回复
都这样:
1、对于 记录级的可以这样:一张 基础表,记录所有人,然后加入 “开始时间”,“结束时间”
2、对于 记录域级变动加入变动记录表 变动表(自增id,表名,主键值,更改的字段,更改时间,原始数据),对于这个表的操作,如果系统还没做,建议在修改基础表的时候写变更日志,如果是现有系统只好
用触发器完成
3、如果是周期性的展示变更,建议照结算周期生成视图(比如 每月一张视图,视图结构和基础表结构一致);或者提供一个函数 接收一个参数(时间点),也是按照基础表字段返回结果集
pbsh 2009-09-17
  • 打赏
  • 举报
回复
我相信一般学校的管理系统数据都不会太大,不用分库,甚至不用分表,设计好表结构以及查询方式应该可以做到吧。
lxw2100 2009-09-17
  • 打赏
  • 举报
回复
做一个历史数据表
tsp3ng 2009-09-16
  • 打赏
  • 举报
回复
设计一个冻结表,按学期来冻结, 把当时学期信息冻结在这个表中.
以后要用到历史信息就根据冻结表查询.

再设计一个更改表,用于跟踪前后变更的信息.
可以根据这个表的信息推算出冻结表的.

fstao 2009-09-15
  • 打赏
  • 举报
回复
学校的想法只不过是保存以往修改数据的历史而已,做一个类似的日志表就可以了,每一次修改时,记录在日志里,比如某年某月某日几时几分几秒修改了什么,原来是什么,现修改是什么,这样就可以了。
guguda2008 2009-09-15
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 js_szy 的回复:]
能不分库,就不分;
能不分表,就不分。
[/Quote]
MSSQL的数据量大到一定程度只能分库分表吧
华夏小卒 2009-09-15
  • 打赏
  • 举报
回复
能不分库,就不分;
能不分表,就不分。
netcup 2009-09-15
  • 打赏
  • 举报
回复
改名字那个,把字段记录到业务表里,就可以记录过去的“张三”了。
jjwang2004 2009-09-15
  • 打赏
  • 举报
回复

历史表
---------------------------------------
id 原表id 变更事由 原表名

---------------------------------------

soft_wsx 2009-09-15
  • 打赏
  • 举报
回复
设计二个历史表!一个汇总,一个明细!
guguda2008 2009-09-14
  • 打赏
  • 举报
回复
数据量大就分历史库,数据量小就分历史表
lihan6415151528 2009-09-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 haolaiwu 的回复:]
to fredrickhu
主要是涉及的表有好几个,历史表怎么处理?
[/Quote]
只要在一个库中即可
billpu 2009-09-14
  • 打赏
  • 举报
回复
帮顶
--小F-- 2009-09-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 haolaiwu 的回复:]
to fredrickhu
主要是涉及的表有好几个,历史表怎么处理?
[/Quote]

几个表是无所谓的 关联也不是很复杂 但是跨库是不建议使用的
xuejiecn 2009-09-14
  • 打赏
  • 举报
回复
想一想,还是有点类似单据的性质,不限于学期的,如果第一学期改了名字,那改了名字之后的查询是不是和改名之前查询的结果一样?
soft_wsx 2009-09-14
  • 打赏
  • 举报
回复
一年的数据一个账套!
像财务软件一样!
加载更多回复(6)

22,301

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧