数据库中的历史数据的处理问题

比如一个教务管理系统,学生毕业之后,这些学生的数据该如何处理?如果导出来放起来,管理员查看起来不方便。但是如果新建一个字段把毕业的学生做个标记,学生越来越多,学生表查询起来会影响效率。

还有一个问题就是比如在删除一个教师的时候并不能真的将其从数据库删除,因为在查看档案时,还要有这个教师的信息,这时候又该如何处理?

阅读 8k
2 个回答

好吧,本身我对数据没有啥大的研究,但是既然邀请我了,我就以以前作ERP类应用的方式以及和湖南长沙某一所知名院校合作过一些项目的经验回答一下下吧。

首先,我们需要知道真正的需求,教务管理系统的功能,我们暂定有下面这些吧:

  • 学生信息管理
  • 教师信息管理
  • 财务信息管理
  • 班级信息管理
  • 课程信息管理
  • 成绩信息管理
  • 打印信息管理
  • 综合信息查询
  • 系统管理

在上面的功能中,有这几个功能会产生大量的数据:

  • 学生信息管理
  • 财务信息管理
  • 班级信息管理
  • 课程信息管理
  • 成绩信息管理
  • 打印信息管理

财务信息

这个我们走标准的财务流程,应该是每年一个封账吧,也就是年底的时候,把整个财务数据封存,然后会通过各种各样的信息,得到一个结果,这个结果,正好就是下一个财务年(叫会计年?我一直没搞明白)期初了,我们不管整个今年的流水如何,然后,到第二年的时候,我们都是再新的帐套,然后从期初开始,这样可以让每一年的帐户更清晰。

所以,对于财务信息来讲,年底的数据肯定是要进入另外的库的,我们只需要在教务系统里面记录一下,不同的年份对应的库是哪个就成了。

与学生相关的功能

这个包括学生信息管理、财务信息管理、班级信息管理、课程信息管理、成绩信息管理、打印信息管理。

这里面我们可以设置两个库,一个库用于存储所有数据,我们就称之为 History 库吧,这个库有可能会很大很大,但是再大也没关系,反正基本上不会用到,只是万不得及的时候,比如学校100周年了,想把20年前毕业的那伙有成就的人找出来看看是不是有哪些人很NB了,让他们来捐点款,然后可能会用得到,那就从历史库里面查个几个小时也是肯定没有关系的。

另外一个库就是实时的生产库了,当期的数据全部都是写入这个库里面的,由于学校的特殊性,数据几乎就是一年一份,第二年的数据和第一年的数据不可能出现复用的情况,所以,当新的一年开始之后,所有数据直接重新导入。

这里面说的一年一年的,其实也不太准确,其实跟这所学校的学习时长有关,比如大学本科,那就是四年,也就是说实时库里面总是有四年的数据,而四年之前的数据都已经删除了,而只能在历史库里面查询。

关于删除的问题

这个需要在程序里面控制,最好的办法是封装一层数据库层,程序里面所有的对数据库的操作都必须过数据库层,在这一层去做一些特定的超出数据库能力范围的事情,比如类与表的对应等(如果用的是SQL数据库的话),然后,你说的那种删除是叫 Soft Delete,软删除,也就是不直接删除数据,而是对数据做标记,我们一般可以直接使用一个 state 字段,然后可以像下面这样的定义:

  • state = -1 :除系统管理员外,不允许其它人访问
  • state = 0 :有相关权限的人可以查看,状态表示该条数据未审核
  • state = 1 :有相关权限的人可以查看,状态正常
  • ……

这样的话,当你执行删除的时候,其实就是执行将 state 值改成 -1,也就是不让别人看到而已,这里面有一个需要知道的就是,如果你这里设置为不让别人看到,那么你必须再要知道,与这个数据相关的数据的处理方式,比如:

  • 当一个老师软删除时,他的所有学生都被分配给NULL老师

要不然,整个系统的数据会很乱的

另外,前面提到的那个和某大学的合作

太X了,我们玩的是互联网,和学校的系统一接入,没一个星期,学校就把接口关了,因为他们那系统扛不住,唉。

对数据库这方面我不是非常懂,说点自己的愚见:

第二个我可以回答,增加一个 trash 字段,删除的时候设置 trash = 1,普通用户查询操作的时候增加 trash = 0 的条件,管理员操作的话不需要。

第一个问题我倒是觉得没什么问题,几年下来顶多也就几十万的数据,应该没什么影响。如果有洁癖的话我个人觉得可以每次新生入学的时候将上一届的学生信息提取出来分表放置。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏