SQL语句引发的思考

来源:互联网 发布:伊戈达拉生涯数据 编辑:程序博客网 时间:2024/04/30 16:04

   在做评教系统的时候,一方面把评教的数据跟基础数据库分离出来了,那也就意味着所有的功能都需要重构,至少在D层完全需要。另一方面,组长说了不让用存储过程。原来的版本大部分都是用存储过程实现的。为什么不用了呢?


   个人理解就是,存储过程是一堆合并的SQL语句集,经编译后存储在数据库当中。只在创建的时候需要编译,相对于一般SQL语句来说,使用存储过程可大大提高执行速度,而且可以完成复杂的判断和较复杂的运算。但是如果我们在项目中大量的使用存储过程,到程序交付使用的时候,随着用户需求的增加会导致数据结构的变化,这样就造成了用户想维护该系统很困难,而且要付出很大的代价。

   鉴于此,所以此次评教系统组长决定不使用存储过程,而改用一般的SQL语句。在做统计教师成绩那一块的时候,因为不用存储过程,又对表进行了合并,所以需要对B层和D层进行功能上的重构。统计教师成绩分为这几步:

  • 清空各项目的平均成绩 (Delete)
  • 计算各项目教师的平均成绩(Select...sum(x)/count(*)
  • 添加各项目教师的平均成绩(Insert into)
  • 取得要计算成绩的课程类型ID、学年、学期(Select top1)
  • 删除教师总成绩表中的数据 (Delete)
  • 计算教师总成绩(Select...sum(x))
  • 添加教师总成绩(Insert into)

   由上面可知,要完成统计教师成绩这个功能,需要用到七条SQL语句。但是这导致的结果是在B层逻辑调用的时候,过程相当的庞大。如下B层的两层调用:


B层统计各项目平均成绩方法:

        /// <summary>        /// 统计教师各项目平均分 ——朱火云 2014年3月19日        /// </summary>        /// <returns>Boolean</returns>        public Boolean StaticAverageScore()        {//调用删除各项目平均成绩方法            Boolean deleteAverageScore = projectAverageScoreDAL.DeleteProjectAverageScore();            if (true == deleteAverageScore)            {//计算各项目平均成绩方法                DataTable dtSelectAverageScore = projectAverageScoreDAL.QueryProjectDetailScore();//添加各项目平均成绩方法                Boolean insetAverageScore = projectAverageScoreDAL.InsertProjectDetailScore(dtSelectAverageScore);                if (true == insetAverageScore)                {                    ProjectAverageScoreEntity enProjectAverageScore = new ProjectAverageScoreEntity();                    return StaticticalTeacherScoresBLL.StaticTeacherTotalScore(enProjectAverageScore);                }                else                {                    return false;                }            }            else            {                return false;            }                               }


B层统计教师总成绩方法:
        /// <summary>        /// 统计教师总成绩,并写入教师总成绩表——朱火云 2014年3月19日        /// </summary>        /// <param name="enProjectAverageScore">平均成绩实体(类型ID、学年、学期)</param>        /// <returns>Boolean</returns>        public static Boolean StaticTeacherTotalScore(ProjectAverageScoreEntity enProjectAverageScore)        {       //获取要计算成绩的课程类型ID、学年、学期            DataTable dtSelectTeacherRecord = teacherTotalScoresDAL.SelectAverageTotalInfo(enProjectAverageScore);      //清空教师总成绩分数表            Boolean deleteTeacherTotalScores = teacherTotalScoresDAL.DeleteTotalScoreInfo(enProjectAverageScore);            if (true == deleteTeacherTotalScores)            {    //计算教师总成绩                DataTable dtTeacherTotalScores = teacherTotalScoresDAL.QueryTeacherTotalScores();                if (dtSelectTeacherRecord.Rows.Count != 0)                {    //添加教师总成绩                    Boolean insertTeacherTotalScores = teacherTotalScoresDAL.InsertTeacherTotalScores(dtSelectTeacherRecord);                    return true;                }                return true;            }            else            {                return false;            }                }


    一开始的时候,并不觉得有什么,感觉很正常。后来想了一下,之所以会认为这样的做法很正常还是因为在项目中锻炼的少。针对上面的多条SQL语句,后期进行了优化,最终优化成了三个SQL语句。这样大大的提高了查询和统计教师成绩效率。
     
  #region 统计教师成绩总分        /// <summary>        /// 统计教师成绩总分 ——朱火云 2014年3月19日        /// </summary>        /// <returns>Boolean</returns>        public Boolean StaticTeacherTotalScores()        {             //删除教师成绩分数信息            Boolean deleteTeacherScores = teacherTotalScoresDAL.DeleteTotalScoreInfo();              //统计教师成绩平均分            Boolean countAverageScore = teacherTotalScoresDAL.QueryProjectAverageScores();             //统计教师成绩总分             Boolean countTotalScore = teacherTotalScoresDAL.QueryTeacherTotalScores();                   if (true == deleteTeacherScores & true == countAverageScore & true == countTotalScore)            {                return true;            }            else            {                return false;            }        }        #endregion

    当然解决这些类似的问题有很多,比如说可以使用存储过程,或者是适当的使用事务等操作。但是这不是自己想要在这说的,毕竟技术的学习很容易,但是如何能让自己主动的去思考问题,在思想上能不能不要那么将就啊!能不能多想一点,这才是自己需要努力的方向。

1 0