tabela de banco de dados para as classes
-
05-07-2019 - |
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
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.
(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).