当前位置: 代码迷 >> C# >> 学生考勤管理系统数据库设计,该怎么处理
  详细解决方案

学生考勤管理系统数据库设计,该怎么处理

热度:232   发布时间:2016-05-05 05:34:12.0
学生考勤管理系统数据库设计
断断续续地接触了些C#的知识,想试着做些小的练习,但在数据库结构设计上始终遇到一些困苦,无法跨越,不知道该学习哪些内容,请高手指点。
学生考勤管理系统需求分析:
主要展现的表格
     1、学生总体情况(视图1):包含基本信息和总体的出勤结果。

 
     2、某天的学生出勤情况统计表(视图2):

 
     3、实验成绩表(视图3):

 
关系说明:
     实验项目由操作者设定。项目分组进行,一组可以设置多名学生。
1、 会涉及到多个班级,是每个班级做一个学生基本信息表,还是用一个表,然后班级作为一个字段?
2、 视图1中,一个学生的出勤总体情况,来自于每天考勤情况的汇总结果。如何处理这个数据?
3、 同一个年级的班级可能选择同样的实验项目,实验成绩表如何设计字段?

------解决思路----------------------
http://download.csdn.net/detail/kang89/2171851,
------解决思路----------------------
从一般的、初始系统的数据建模上来看:

1. 一般来说,将非常固定的概念做为对象(类)才靠谱。而“班级”是业务中的属性。如果要你设计“某一个班级的学生基本情况表”你怎样设计?基本资料数据库表至少应该满足数据库的前三个范式,但是你可以看到这无法满足数据库第二范式,也不满足面向对象的第一基本原则。而每当增加一个班级时就增加一个数据库表,这也本来就是当前阶段设计建模的任务(当前阶段设计建模时就要把这些需求包括进来,而不是等需求变了再去修改数据表)。你的“学生基本情况表”需要包括所有班级。

2. 你的“每天考勤情况统计表”在数据库表示上是错误的。它显然同样不符合基本的数据库范式,或者基本的面性对象第一基本原则。当你增加表中第4条记录的时候,主键是什么?你确定不了吧?!同时这个表如果是“每天创建一份”,也是不符合当前阶段设计建模任务要求的。除非你在整个需求上就可以把“每一天”的需求给“短篇儿”的分析,如果你的需求描述总是连续的,那么你的“考勤情况统计表”也是需要包括所有日期。

然后所谓的“每个学生的旷课次数、迟到次数、请假次数”都是统计快照,不是数据库表中的内容。不管你以什么方式提供,总之是跟基本的数据库表相分离的。那么你把每一个学生的这三项信息的查询(比如说sql查询)单独写出来,测试出来,最后再在需要显示时跟学生基本信息表进行 left join 即可。通常最初是设计为临时进行查询和关系运算,至于这查询有没有“视图、缓存、冗余的辅助表”之类的,那是程序后期优化的事情。

3. 实验成绩表示一个二维表。而关系数据库基本上都不支持二维表,所以你需要把二维表先转换为一维表,然后在应用程序界面上再显示为二维表。

实际上,将“班级”不同考虑进来,你这个是3维表。

将n维表转换为普通关系数据库中希望表示的一维表,这样的表无法满足关系数据库第二范式,但是仍然要满足基本的面向对象第一原则。于是从数据库表上看,“班级、组、学生名(实际应该包括学号)、实验名称”作为组合的主键,然后还需要有一个“成绩”字段。这个表至少有5个字段,只有一个字段是数据,其它都是这个数据的“标题”。这是n维表的特征——多个标题,通常只一个value 字段(实际上既然有5个字段,我们可以说这最终设计为是4维表)。

n维表不符合关系数据库的第二范式,这其实也说明数据库范式有缺点。做为“标题字段”的前4个字段,要组合成关系数据库主键,来行使类似于第二范式的职责。
------解决思路----------------------
这也本来就是当前阶段设计建模的任务  -->   这也本来就不是当前阶段设计建模的任务

在初始(对学生所要求)的设计中,基本上不考虑工程需求,只考虑让你符合一些静态的模型要求。所以不允许你动态去创建什么“班级表”。
------解决思路----------------------
参考:http://www.lwcheng.com/article/html/561.html
http://download.csdn.net/detail/MARSMMS/903659
http://download.csdn.net/download/huangfurongjsj/3131954
  相关解决方案