Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我应该如何处理数据库中的累进状态代码?_C#_Tsql_Data Structures - Fatal编程技术网

C# 我应该如何处理数据库中的累进状态代码?

C# 我应该如何处理数据库中的累进状态代码?,c#,tsql,data-structures,C#,Tsql,Data Structures,我正在为一个学术机构做一个项目,我需要关于解决这个问题的最佳方法的建议。我已经很久没有做过任何传统的应用程序开发了(将近五年) 学院管理部门最近修订了学院的学术标准政策。以前,政府只有三个身份代码,所以这不是一个大问题。但是,新政策有六个状态代码: 良好信誉 学术关注 学术干预(1) 一期解雇 学术干预(2) 四期解雇 从这里开始,我将用termGPA来区分术语的GPA,用cumGPA来区分累积GPA。如果学生的学期平均成绩低于2.0,并且导致他/她的平均成绩也低于2.0,他/她将被置于学术关注

我正在为一个学术机构做一个项目,我需要关于解决这个问题的最佳方法的建议。我已经很久没有做过任何传统的应用程序开发了(将近五年)

学院管理部门最近修订了学院的学术标准政策。以前,政府只有三个身份代码,所以这不是一个大问题。但是,新政策有六个状态代码:

  • 良好信誉
  • 学术关注
  • 学术干预(1)
  • 一期解雇
  • 学术干预(2)
  • 四期解雇
  • 从这里开始,我将用termGPA来区分术语的GPA,用cumGPA来区分累积GPA。如果学生的学期平均成绩低于2.0,并且导致他/她的平均成绩也低于2.0,他/她将被置于学术关注的地位。一旦涉及到学术问题,以下三种情况中的一种会发生在学生身上。他们:

  • 如果termGPA和cumGPA高于2.0,则恢复良好信誉
  • 如果termGPA高于2.0,但cumGPA低于2.0,则保持当前状态
  • 如果termGPA和cumGPA均低于2.0,则移动到下一状态
  • 通常,我会通过编写一个控制台应用程序来处理这个过程,该应用程序迭代地处理每个学生,并在运行时构建状态代码。然而,我们至少接待了8000名学生,在大多数情况下,每个学期大约有12500名学生

    此外,这项政策必须在一段尚未确定的时间内追溯适用(因为以前的学生可以返回学院,然后受到新政策的限制),一旦我将一名学生纳入数据集中,我必须回顾该学生在学院的整个历史。我保守地猜测,我将通过至少一百万个学生的记录,计算每个学生的学期平均成绩和滚动平均成绩

    问题:

  • 有没有办法在SQL中处理这个问题并避免使用游标
  • (假设对1.的回答是“否”)我应该如何构造控制台应用程序?我应该在写入数据库之前创建一个大型集合并一次处理数千名学生,还是在每次处理每个学生之后更新数据库
  • 我在这件事上做得太过分了吗
  • 提前感谢您提供的任何见解和建议


    编辑:根据这里对答案的评论,我应该提供更多关于数据结构和计算GPA方法的信息

    我不能在我们的数据库中使用预先计算的cumGPA值——我需要学生在每学期结束时的cumGPA,就像这样(注意:我在下面列出了GPA值):

    问题是,每个后续术语的状态代码都可能依赖于前一术语的状态代码——良好的信誉实际上是唯一不依赖的


    据我所知,这意味着我必须使用SQL中的游标来获取每个学生的最新状态代码,这不是我感兴趣的,因为我在一所资金紧张的学院工作,该学院正好有三个数据库服务器:一个用于测试,两个服务器上有相同的数据(我们正在迁移到SQL Server 2008 R2).

    这很有趣。我认为您不必太担心SQL的性能。它将在您的应用程序中运行得相当快。我只是运行了一个愚蠢的小控制台应用程序来修复一个混乱,一次插入15000条记录。这大约需要5秒钟。

    首先,12000条记录对于现在的数据库来说已经不算什么了,所以这不是你的习惯。你应该把重点放在保持简单上。似乎你的数据库将根据事件关闭,所以我建议使用触发器,即:插入termGPA时第一次触发-更新cumGPA,cumGPA更新后的第二次-检查你的条件和更新状态(如果发生)。

    即使是SQL现在可以处理高达10 GB的数据库。12500条记录很小。要处理100万条记录,您应该对每个学生或组进行筛选,以允许清除传输日志。这可以通过使用游标或控制台应用程序来完成。如果您可以在TSQL中执行计算,则批量处理可能比一次一条更快e、 缺点是批处理越大,传输日志越大,因此存在一个最佳点。如果计算对于TSQL来说太复杂,并且花费的时间几乎与insert语句一样长(或更长),则可以在单独的线程上插入(或在单独的线程上计算)因此,插入和计算是并行的。我这样做是一个应用程序,我从文本中解析单词-解析大约需要插入单词所需的时间。但我不会让它旋转多个线程。在SQL端,它仍然必须维护索引,并使用两个线程的插入来命中它。只需要两个线程就可以了线程越快,等待的越慢。更新的顺序也很重要。如果按照聚集索引的顺序进行处理,那么记录就越有可能已经在内存中了。

    我最后用C编写了一个控制台应用程序来处理这些状态代码。我的用户更改了初始状态更新要求nts只包括前两个术语,但这个过程有足够多的边缘案例,因此我选择花时间编写更干净、面向对象的代码,一旦这个策略成熟和改变,这些代码将更容易恢复(他说,希望如此)


    此外,我最终不得不将此数据库部署到SQL 2005实例上,因此表值参数对我不可用。如果是这样,我会选择仅在处理每个学生后提交到数据库,而不是在处理每个学生的每个学期后提交到数据库。

    好吧,我不会进行操作
    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