Hi Larry,
Here is my redesign.
View attachment 112355
It seems to me to be more logical.
The student_has_subject junction table expresses the relationship
Each student can have many subjects
Each subject can have many students
The primary key of this junction table is an instance of a student_subject (these are unique because a student can only be in a subject once). The remaining fields in this junction table then express the class, year group and academic cycle the student is currently registered into - these change once per year as the student data is imported from my external file. Once a student no longer appears in my external file (because they have left) their data will no longer be updated but will remain as their last class, year group and academic cycle - this allows me to view data for students who have left.
Not shown on here are three tables containing ids for class, year group and academic cycle - I realise that these values could be directly placed into the junction table but I will need the values to populate comboboxes on forms to allow me to select a class/year/etc.
The crucial bit is now the assessments belong to a particular instance of a student_subject. This table will store marks for a student_subject for each possible assessment they take.
Since we store raw marks (saves calculating percentages for every student after adding marks for a test), I also store the max mark for the assessment and details of how it is graded. This can now change every year because I have a table (set up at the beginning of the year as part of the roll over of students) which stores the current max_marks and gradeset_id.
I have created a form that can be used to edit/add student marks for a test (key requirement of the design - this is like adding data into our old spreadsheet).
I have a query that can grab all the student data and display it in a form that allows me to see the progress of students (by class or year).
I have a form that can import student data from my school database (samples included in the zip file) - this populates the student table and updates the enrolment.
See what you think. I may have missed something obvious.
Thanks for reading,
Martyn