2008-10-31 3 views
1

Я пытаюсь определить таблицу для хранения оценок учащихся для онлайн-карты отчета. Однако я не могу решить, как это сделать.Таблица базы данных для классов

Оценки даются по предмету в триместрном периоде. Каждый триместр имеет средний класс, общее количество пропущенных классов и «восстанавливающую оценку» (я не знаю правильного термина на английском языке, но это дополнительный тест, который вы предпринимаете, чтобы попытаться повысить свой уровень, если вы ниже среднего) , Я также должен хранить среднюю и конечную оценку «урожай». В принципе, это так:

 |1st Trimester  |2nd Trimester  |3rd Trimester 
Subj. |Avg. |Mis. |Rec |Avg. |Mis. |Rec |Avg. |Mis. |Rec |Year Avg. |Final Rec. 
Math |5.33 |1  |4 |8.0 |0   |7.0 |2   |6.5  |7.0 
Sci. |5.33 |1  |4 |8.0 |0   |7.0 |2   |6.5  |7.0 

Я мог бы хранить эту информацию в одной БД строки, с каждой строкой, как это:

1tAverage | 1tMissedClasses | 1tRecoveringGrade | 2tAverage | 2tMissedClasses | 2tRecoveringGrade 

И так далее, но я полагал, что это будет боль mantain, если scholl когда-либо решает учесть бифестер или какой-то другой период (как это было до 3 лет назад).
Я мог бы также обобщить поля таблицы и использовать tinyint для обозначения того, за какой триместр эти оценки, или если они являются финалами года. Но этот вопрос потребует много подзапросов, чтобы написать отчетную карточку, а также боль в mantain.

Какой из двух лучше, или есть какой-то другой способ? Thanks

+0

Это домашнее задание? – jonnii

+0

Если бы это было домашнее задание, он не хотел бы его поддерживать. Хотя, возможно, он просто застрял, чтобы выбросить нас. – davr

+0

Nop, проект с работы, но мы небольшая компания, у которой нет возможности моделирования данных, и я все еще стажер – Gabe

ответ

6

Вы можете попробовать структурировать его, как это, с помощью ваших таблиц. У меня не было всей информации, поэтому я сделал некоторые догадки о том, что вам может понадобиться или сделать со всем этим.

TimePeriods:

  • ID (INT)
  • PeriodTimeStart (DateTime)
  • PeriodTimeEnd (DateTime)
  • Имя (УАКСНАК (50)

Студенты:

  • ID (INT)
  • FirstName (VARCHAR (60))
  • LastName (VARCHAR (60))
  • День рождения (DateTime)
  • [любая другая соответствующая область студента добавлена ​​информация ...как контакт информации, и т.д.]

Grading:

  • ID (INT)
  • StudentID (INT)
  • GradeValue (поплавок)
  • TimePeriodID (INT)
  • IsRecoveringGrade (boolean)

MissedClasses:

  • ID (INT)
  • StudentID (INT)
  • ClassID (INT)
  • TimePeriodID (INT)
  • DateMissed (DateTime)

Классы:

  • ID (INT)
  • ИмяКласса (VARCHAR (50))
  • ClassDescription (ТЕКСТ)
+0

Хотя проект не требует всех этих таблиц, разделение данных, подобных этому, кажется лучшим решением. Гораздо менее вероятно, что это будет сложно. Thanks Handruin – Gabe

+0

Нет проблем. Вы сказали, что не хотите, чтобы это было болью для поддержания ... Я пытался нормализовать, насколько мог, с предоставленной информацией. Эта структура позволит ей расти. У вас не было бы много подзапросов для получения карточек отчетов. Если вам нужны примерные запросы, попросите данные, которые вам нужны. – Handruin

0

Я думаю, что лучшим решением является сохранение одной строки за период. Таким образом, вы бы таблицу, как:

grades 
------ 
studentID 
periodNumber 
averageGrade 
missedClasses 
recoveringGrade 

Так что, если это 2-х семестров, вы бы иметь периоды 1 и 2. Я предлагаю использовать период 0 означает «в целом за год».

0

Лучше иметь вторую таблицу, представляющую триместр, и иметь ссылку на внешний ключ в триместре из таблицы оценок (и хранить отдельные оценки в таблице оценок). Затем выполняйте средние значения, пропущенные классы и т. Д., Используя SQL-функции SUM и AVG.

+0

Это зависит от того, как часто вам нужны GPA. Если вам это нужно много, вы добавляете много дополнительного времени для вычисления. Как только срок над GPA для этого термина может быть предварительно рассчитан и сохранен для более легкого/быстрого/более легкого поиска. – Stimy

+0

@Stimy - Вы пытаетесь решить проблему, которая может не существовать. Большинство РСУБД достаточно хороши при вычислении агрегатов. Это очень плохая идея для денормализации базы данных, поскольку вы считаете, что могут возникнуть проблемы с производительностью. Если в школе нет миллионов учеников, нормализованная БД должна быть хорошей. –

+0

Я упустил агрегаты компиляции, но новую таблицу можно было легко добавить, чтобы сохранить их на основе TimePeriod в моем примере выше. Они могут быть сгенерированы триггерным или запланированным заданием в конце периода времени, а затем сохранены. Как сказал Том, это зависит от количества студентов и использования. – Handruin

0

This comes to mind.

(А если серьезно, допустите ошибку на стороне слишком много таблиц, и не слишком мало. Handruin имеет лучшее решение, которое я вижу до сих пор).

Смежные вопросы