Pergunta

Estou tentando definir uma tabela de notas loja de estudante para um cartão de relatório online. Eu não posso decidir como fazê-lo, no entanto.

As notas são dadas por assunto, em um período trimestral. Cada trimestre tem uma nota média, o total perdido as classes e um "grau de recuperação" (Eu não sei o termo certo em Inglês, mas é um teste extra que você tomar para tentar aumentar o seu grau se você está abaixo da média) , eu também tenho que armazenar o ano médio e final "recuperando grade". Basicamente, é assim:

      |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

Eu poderia armazenar essas informações em uma única linha DB, com cada linha como esta:

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

E assim por diante, mas eu descobri que seria uma dor de mantain, se o scholl sempre decide grau por bimestre ou algum outro período (como costumava ser até 3 anos).
Eu também poderia generalizar os campos da tabela, e usar uma tinyint para sinalizar para o qual trimestre esses graus são, ou se eles são as finais ano. Mas isso seria pedir um monte de subconsultas para escrever o boletim, também uma dor de mantain.

Qual dos dois é melhor, ou se há alguma outra maneira? Graças

Foi útil?

Solução

Você poderia tentar estruturação lo como este, com suas tabelas. Eu não tenho todas as informações então fiz algumas suposições para o que você pode precisar ou fazer com tudo isso.

TimePeriods:

  • ID (INT)
  • PeriodTimeStart (DateTime)
  • PeriodTimeEnd (DateTime)
  • Nome (VARCHAR (50)

Estudantes:

  • ID (INT)
  • FirstName (VARCHAR (60))
  • LastName (VARCHAR (60))
  • Aniversário (DateTime)
  • [qualquer outro campo estudante relevante informações adicionadas ... como contato info, etc]

Grading:

  • ID (INT)
  • StudentID (INT)
  • GradeValue (float)
  • TimePeriodID (INT)
  • IsRecoveringGrade (boolean)

MissedClasses:

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

Classes:

  • ID (INT)
  • ClassName (VARCHAR (50))
  • ClassDescription (texto)

Outras dicas

Eu acho que a melhor solução é armazenar uma linha por período. Então você teria uma tabela como:

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

Então, se é 2 semestres, você teria períodos 1 e 2. Eu sugiro usar período de 0 a significar "global para o ano".

É melhor ter uma segunda tabela representando trimestre, e ter uma referência de chave estrangeira para o trimestre da tabela de classes (e armazenar notas individuais na tabela de notas). Em seguida, faça as médias, aulas perdidas, etc usando funções SQL SUM e AVG.

Isto vem à mente.

(Mas, falando sério, err no lado de muitas mesas, não muito poucos. Handruin tem a melhor solução que eu vejo até agora).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top