http://download.csdn.net/detail/kang89/2171851,

解决方案 »

  1.   

    从一般的、初始系统的数据建模上来看:1. 一般来说,将非常固定的概念做为对象(类)才靠谱。而“班级”是业务中的属性。如果要你设计“某一个班级的学生基本情况表”你怎样设计?基本资料数据库表至少应该满足数据库的前三个范式,但是你可以看到这无法满足数据库第二范式,也不满足面向对象的第一基本原则。而每当增加一个班级时就增加一个数据库表,这也本来就是当前阶段设计建模的任务(当前阶段设计建模时就要把这些需求包括进来,而不是等需求变了再去修改数据表)。你的“学生基本情况表”需要包括所有班级。2. 你的“每天考勤情况统计表”在数据库表示上是错误的。它显然同样不符合基本的数据库范式,或者基本的面性对象第一基本原则。当你增加表中第4条记录的时候,主键是什么?你确定不了吧?!同时这个表如果是“每天创建一份”,也是不符合当前阶段设计建模任务要求的。除非你在整个需求上就可以把“每一天”的需求给“短篇儿”的分析,如果你的需求描述总是连续的,那么你的“考勤情况统计表”也是需要包括所有日期。然后所谓的“每个学生的旷课次数、迟到次数、请假次数”都是统计快照,不是数据库表中的内容。不管你以什么方式提供,总之是跟基本的数据库表相分离的。那么你把每一个学生的这三项信息的查询(比如说sql查询)单独写出来,测试出来,最后再在需要显示时跟学生基本信息表进行 left join 即可。通常最初是设计为临时进行查询和关系运算,至于这查询有没有“视图、缓存、冗余的辅助表”之类的,那是程序后期优化的事情。3. 实验成绩表示一个二维表。而关系数据库基本上都不支持二维表,所以你需要把二维表先转换为一维表,然后在应用程序界面上再显示为二维表。实际上,将“班级”不同考虑进来,你这个是3维表。将n维表转换为普通关系数据库中希望表示的一维表,这样的表无法满足关系数据库第二范式,但是仍然要满足基本的面向对象第一原则。于是从数据库表上看,“班级、组、学生名(实际应该包括学号)、实验名称”作为组合的主键,然后还需要有一个“成绩”字段。这个表至少有5个字段,只有一个字段是数据,其它都是这个数据的“标题”。这是n维表的特征——多个标题,通常只一个value 字段(实际上既然有5个字段,我们可以说这最终设计为是4维表)。n维表不符合关系数据库的第二范式,这其实也说明数据库范式有缺点。做为“标题字段”的前4个字段,要组合成关系数据库主键,来行使类似于第二范式的职责。
      

  2.   

    参考:http://www.lwcheng.com/article/html/561.html
    http://download.csdn.net/detail/MARSMMS/903659
    http://download.csdn.net/download/huangfurongjsj/3131954