Je suis novice en SQL et j'essaie de créer un schéma de base de données utilisable avec Hibernate, mais je m'inquiète des problèmes de mise à l'échelle, d'accès aux données et de la meilleure façon d'interroger les données.
Projet : Système de notation des écoles
Le contexte : Nous voulons stocker tous les devoirs, mais si nous projetons une école ayant 4000 étudiants chacun avec ~182 jours de classe. S'il y a un devoir noté par jour (en classe + devoirs), alors chaque élève peut avoir 182 x 6 x 4000, ce qui signifie qu'il y a ~4,3 millions de notes par année scolaire. ~Soit 43,7 millions en 10 ans.
Je devrais être en mesure d'afficher tous les devoirs par trimestre et la note actuelle. Je devrais également pouvoir les obtenir pour n'importe quelle année où j'ai fréquenté l'école (1 trimestre à la fois). Les enseignants et les administrateurs devraient être en mesure de récupérer l'historique stocké (encore une fois, 1 trimestre à la fois).
Questions :
Q1 Scalability Y aura-t-il un problème de performance ? Y a-t-il un problème lorsqu'une table atteint 100 millions d'entrées ?
Accès aux données : Y a-t-il une meilleure façon de diviser les données ? Je pense récupérer les données de notes par étudiant sur l'identifiant entre les dates (donc les trimestres) qui sont dans les affectations. Dois-je ajouter une autre colonne pour l'ID du trimestre et créer une table pour les stocker ?
Grades d'accès : Quelle est la meilleure façon d'interroger les notes trimestrielles d'un étudiant ?
- Grade[] getStudentGrades( studentid, startdate, enddate )
Naturellement, cela va de pair avec
- Assignment[] getAssignmentDetails( Grade[] grades )
Je sais que ces deux classes peuvent être jointes dans une autre classe GradedAssignment en utilisant une jointure SQL :
- GradedAssignment[] getStudentGradedAssignement( studentid, startdate, enddate )
Ce schéma vous semble-t-il correct ? (Ajout des mises à jour ci-dessous)
NOTE : J'ai omis, par souci de concision, de nombreuses colonnes du tableau.
Étudiant
- étudiant (PK)Classe d'étudiants (Tableau de référence)
- classid (FK)
- étudiant (FK)Enseignant
- identifiant du professeur (PK)EnseignantClasse (Tableau de référence)
- identifiant du professeur (PK)
- identifiant de classeGrades (La seule clé primaire à laquelle j'ai pensé est composée de assignmentid+studentid)
- assignmentid (FK)
- grade
- identifiant de classe
- étudiant (FK)Affectation
- numéro de mission (PK)
- teacherid (FK)
- pointsPossibles
- date de cession
- Date d'échéance
- nom
- description
Quelle est la meilleure façon d'accéder aux notes ?
- SELECT Assignment.pointsPossible, Assignment.name, Grade.grade FROM Grade,Assignment WHERE grade.studentid=:id AND Grade.assignmentid == Assignment.assignmentid AND Assignment.assignDate < :dateFinish AND Assignment.assignDate > :dateStart ;
ou utiliser un JOIN ???
- SELECT Assignment.pointsPossible, Assignment.name, Grade.grade FROM Grade LEFT JOIN Assignment on assignmentid WHERE grade.studentid=:id AND Assignment.assignDate < :dateFinish AND Assignment.assignDate > :dateStart ;