日期:2014-05-17  浏览次数:20507 次

关于学生系统的设计,非毕业论文类的玩具
最近有一个针对多个学校的数据库设计,关于学生部分遇到的点问题;

用户要求,能够查询到学生曾经在那个班级待过,并且能够回溯当时班级一些成员。

目前的设计是这样的,
学生表

年级表(各个年级,包括年级的别名)

班级表(各个班级,包括班级的别名)

班级实体表  当前年的班级信息

班级成员表  记录当前班级有哪些人()

学生变动历史表:记录当前学生转学、转班的信息等

数据量来讲的话,每年大概有5万的学生量。

现在针对处理学生的历史情况分为两种意见:


1、学生每年执行“升级”操作,每升一级,需要用户手动的对学生的信息进行操作,创建新的班级实体,把人员重新复制一份
(2010年1年级1班)到了明年就是(2012年2年级2班),缺点是数据量大,每年需要用户手动操作,用户不喜欢

2、班级的实体不变化, 针对的学生内容仅记录该学生的转出转入记录,如果想要历年的学生信息的话,需要从历史表中进行查询,处理起来会比较麻烦。


我现在有2个问题:
1、每年5万的数据量+其他的一些数据,是不是不算大?数据量多少的算是大数据量?


2、我们应该采用哪种方式比较合理?


3、关于这种数据库设计的书,有没有人推荐一本(最好是以实例为主的)

数据库设计 数据库?

------解决方案--------------------
学生表:ids
班级表:idc
逐年-班级-成员-表:idy:idc-年份(学期)
学生变动历史表:idsh:ids-idy-具体日期

每年5万的数据量 远不算大,mssql2005企业版对付每年1亿都算中等水平
------解决方案--------------------
学生信息主体不应该拷贝。把班级实体每年新增,然后把班级成员关系拷贝一遍。这样就几个字段,数据量虽多,占得空间不会太大。

学生表 Student(StudentID 主键)
班级表 Class(ClassID)
班级成员 Class_Studeng(ClassID, StudentID).

每年得有个标志信号来进行班级升级,如果能找到一个程序能识别的信号,就可以自动升级;要不就只有手动了
每年5W学生。一般就是Access也能支持几十万级别的,够你十年的。其他数据库就更不用说了。
------解决方案--------------------
1、每年5万的数据量+其他的一些数据,是不是不算大?数据量多少的算是大数据量?
     每年5万数据,不算大数据量,一般说大数据量是定位在TB级别或PB级别。

2、我们应该采用哪种方式比较合理?
   建议是第2中方式,班级的实体不变化, 针对的学生内容仅记录该学生的转出转入记录,如果想要历年的学生信息的话,需要从历史表中进行查询,处理起来会比较麻烦。
    个人觉得从自然的角度去考虑,班级(1年级1班,1年级2班。。。)是不变的,每年都存在(相对来说)。只不过每年班级里面的学生,老师名单发生变化。
   e.g.
   表a:班级master表(班级ID,名称)
   表b:学生表(学生ID,姓名)
   表c:老师表(老师ID,姓名)   
   表d:班级与学生关系表(班级ID,学生ID,开始时间,结束时间)
   表e:班级与老师关系表(班级ID,老师ID,开始时间,结束时间)
这里的表d 和表e ,是一个非常有灵活的表,这里我演示一个模拟表d的数据:
  ------------------------------------
   班级ID 
------解决方案--------------------
 学生ID 
------解决方案--------------------
 开始时间 
------解决方案--------------------
 结束时间
  ------------------------------------
   1年级1班 学生甲    2012-9-1  2013-1-20
   1年级1班 学生乙    2012-9-1  2013-1-20
   1年级1班 学生丙    2012-9-1  2013-1-20
   ... ...
如果数据库设计要更严谨,那么这里可以把表d中的开始时间和结束时间抽取出来设计成一个学期表,那么数据库设计的复杂度就会高,而且需要考虑学生转学,转班等其他特殊情况。

3、关于这种数据库设计的书,有没有人推荐一本(最好是以实例为主的)
可以看Physical Database Design (2007)  和 Database Modeling And Design , 4ed(2005) 
都不错。