Я работаю над проектом для академического учреждения, и мне нужен совет, как лучше решить эту проблему. Прошло много времени с тех пор, как я занимался разработкой традиционных приложений (около пяти лет).
Администрация колледжа недавно пересмотрела политику академических стандартов колледжа. Раньше у администрации было только три кода статуса, так что это не было большой проблемой. Однако новая политика имеет шесть кодов статуса:
- Хорошее состояние
- Академический концерн
- Академическое вмешательство (1)
- Увольнение на один срок
- Академическое вмешательство (2)
- Четырехместное увольнение
С этого момента я буду различать GPA для данного термина, произнося termGPA, и совокупный GPA, говоря cumGPA. Если termGPA студента падает ниже 2,0, и это приводит к тому, что его / 10 * cumGPA также падает ниже 2,0, он / она попадает в Академический концерн. Однажды на Академическом Концерне, одна из трех вещей может произойти со студентами в следующих условиях. Они:
- Вернитесь к хорошей репутации, если их termGPA и cumGPA поднимутся выше 2,0.
- Оставаться в текущем состоянии, если их termGPA выше 2,0, но их cumGPA остается ниже 2,0.
- Перейти к следующему статусу, если их termGPA и cumGPA ниже 2.0.
Обычно я подхожу к этому процессу, написав консольное приложение, которое обрабатывает каждого учащегося итеративно и строит коды состояния на ходу. Однако мы принимаем не менее 8000 студентов, а в большинстве случаев около 12 500 студентов в семестр.
Кроме того, эта политика должна применяться задним числом в течение еще не определенного периода времени (поскольку бывшие студенты могут вернуться в колледж и затем будут подчиняться ограничениям новой политики), и как только я включу студента в набор данных, я должен вернуться через всю историю этого студента с колледжем. Я консервативно предполагаю, что пройду не менее миллиона студенческих записей и вычислю семестр каждого учащегося и скользящий балл cumGPA.
Вопросы:
- Есть ли способ решить эту проблему в SQL и избежать использования курсора?
- (при условии, что ответ на вопрос 1. «Нет») Как мне структурировать консольное приложение? Должен ли я создавать большую коллекцию и обрабатывать несколько тысяч студентов за раз перед записью в базу данных или обновлять базу данных после каждой обработки каждого студента?
- Я слишком об этом договариваюсь?
Заранее благодарим за понимание и советы.
Редактировать: Основываясь на комментариях к ответам здесь, я должен был предоставить больше информации о структурах данных и способах вычисления 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, чтобы получить самый последний код состояния каждого учащегося, что меня не интересует, так как я работаю в колледже с нехваткой денежных средств, который имеет ровно три сервера базы данных: один для тестирования и два сервера с одинаковыми данными на них (мы находимся в процессе перехода на SQL Server 2008 R2).