关于学生系统的设计,非毕业论文类的玩具
最近有一个针对多个学校的数据库设计,关于学生部分遇到的点问题;
用户要求,能够查询到学生曾经在那个班级待过,并且能够回溯当时班级一些成员。
目前的设计是这样的,
学生表
年级表(各个年级,包括年级的别名)
班级表(各个班级,包括班级的别名)
班级实体表 当前年的班级信息
班级成员表 记录当前班级有哪些人()
学生变动历史表:记录当前学生转学、转班的信息等
数据量来讲的话,每年大概有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)
都不错。