3 votes

Besoin d'un schéma pour le système de notation des écoles

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 classe

Grades (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 ;

3voto

Rachcha Points 2925

Compte tenu de la dynamique d'une école, je pense qu'il faut ajouter quelques éléments à votre schéma. Par exemple, les élèves passent d'une classe à une autre chaque année. Ces conditions doivent également être prises en compte pour construire une application durable.

Je pense qu'un bon schéma serait -

Étudiant

  • studentid (clé primaire)
  • prénom
  • nom de famille
  • date_de_naissance
  • .... (toutes les autres informations personnelles de base nécessaires à l'enregistrement)

Classe d'étudiants

  • studentid (références de la clé étrangère student.studentid)
  • classid (clé étrangère référençant class.classid)
  • date d'admission
  • ... (toute autre information relative à l'admission ou à la promotion d'un élève dans une classe)

Classe

  • classid (clé primaire)
  • nom de classe
  • ... (toute autre information relative à une classe)

EnseignantClasse

  • teacherid (références de la clé étrangère teacher.teacherid)
  • classid (références de clé étrangère class.classid)
  • date d'affectation
  • libéré
  • ...

Enseignant

  • teacherid (clé primaire)
  • prénom
  • nom de famille
  • qualification
  • date_de_naissance
  • ...

Affectation

  • assignmentid (clé primaire)
  • assigning_teacherid (références de la clé étrangère teacher.teacherid)
  • pointsPossible
  • assignDate
  • dueDate
  • nom
  • description
  • ...

Grade

  • assignmentid (fk)
  • classid (fk)
  • étudiant (fk)
  • grade
  • ...

Vous avez raison au sujet de la clé primaire composée sur (assignmentid, studentid) qui sont également des clés étrangères.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X