我正在为一个学术机构做一个项目,我需要关于解决这个问题的最佳方法的建议。我已经很久没有做过任何传统的应用程序开发了(将近五年)。
学院管理部门最近修改了学院的学术标准政策。在此之前,奥巴马政府只有三个身份代码,所以这并不是什么大问题。然而,新政策有六个地位代码:
好的Standing
从现在开始,我将用termGPA来区分GPA和用cumGPA来区分GPA。如果一个学生的termGPA低于2.0,而这也导致他/她的cumGPA下降到2.0以下,那么他/她就会受到学术上的关注。一旦有了学术上的关注,三件事中的一件可能会发生在学生身上。他们:
如果
通常,我会通过编写一个控制台应用程序来处理这个过程,这个应用程序可以迭代地处理每个学生,并在我进行过程中构建状态代码。然而,我们正在处理至少8000名学生,在大多数情况下,每学期大约有12,500名学生。
此外,这项政策必须在一段尚未指明的时期内追溯适用(因为以前的学生可以返回学院,然后将受到新政策的限制),一旦我将一名学生纳入数据集,我就必须回顾该学生在学院的全部历史。我保守地猜测,我至少要通过一百万次学生记录,计算每个学生的termGPA和滚动cumGPA。
问题:
在cursor?
提前感谢您的任何见解和建议。
编辑:基于这里对答案的评论,我应该提供更多关于数据结构和计算GPA的方式的信息。
我不能在我们的数据库中使用预先计算过的cumGPA值--我需要学生的cumGPA在每个累进项的末尾,像这样(注意:我在下面合成了GPA值):
ID TermID CumGpa TermGPA TermNumber PolicyCode
123545 09-10-2 2.08 2.08 1 GoodStanding
123545 09-10-3 1.94 0.00 2 AcademicConcern
123545 09-10-4 1.75 1.00 3 AcademicIntervention
123545 10-11-2 1.88 2.07 4 AcademicIntervention
123545 10-11-4 2.15 2.40 5 GoodStanding
123545 11-12-1 2.30 2.86 6 GoodStanding问题是,每个后续术语的状态代码可能取决于前一项的状态代码--良好的信誉实际上是唯一不依赖的。
据我所知,这意味着我必须使用SQL中的游标来获取每个学生的最新状态代码,这不是我感兴趣的事情,因为我在一所资金紧张的大学工作,该学院恰恰有三台数据库服务器:一台用于测试,两台服务器上有相同的数据(我们正在转向Server 2008 R2)。
发布于 2011-10-12 15:04:59
最后,我用C#编写了一个控制台应用程序来处理这些状态代码。我的用户更改了最初的状态更新要求,只包括前两个术语,但是这个过程有足够的边缘情况,因此我选择花时间编写更干净、面向对象的代码,这样在这个策略成熟和改变之后(他希望)能够更容易地恢复(他说)。
而且,我最后不得不将这个数据库部署到一个SQL 2005实例中,因此表值参数对我来说是不可用的。如果是的话,我会选择只在处理每个学生之后,而不是在处理每个学生的每个学期之后,才提交数据库。
发布于 2011-10-05 17:14:56
这很有趣。我认为您不必太担心SQL性能。对于您的应用程序,它将运行得相当快。我只是运行了一个愚蠢的小控制台应用程序来解决一个混乱,并插入了15000条记录一次。大约花了5秒。
发布于 2011-10-05 17:20:50
首先,对于现在的数据库来说,12000条记录是没有意义的,所以这不是你的任务。你应该专注于保持简单。似乎您的数据库将基于事件被关闭,所以我将使用触发器(即:当插入termGPA时使用)更新cumGPA,在cumGPA更新之后的第二个触发器检查您的标准和更新状态(如果它们发生了)。
https://stackoverflow.com/questions/7664962
复制相似问题