> There really is no sane way to modify a set after students have started working on it.
If the id of the problem in the database were separated from the label, that seems like an approach that could work. As in:
Create problem set:
id 1, label 1, active
id 2, label 2, active
id 3, label 3, active
Open the problem set and students do work:
id 1, label 1, active, studentDataFoo
id 2, label 2, active, studentDataBar
id 3, label 3, active, student DataBaz
Remove #2 from the problem set:
id 1, label 1, active, studentDataFoo
id 2, label empty, inactive, studentDataBar
id 3, label 2, active, student DataBaz
# "label empty" could imply "inactive", relieving the need for that column
Change order of problems:
id 1, label 2, active, studentDataFoo
id 2, label empty, inactive, studentDataBar
id 3, label 1, active, student DataBaz
Add a new problem:
id 1, label 2, active, studentDataFoo
id 2, label empty, inactive, studentDataBar
id 3, label 1, active, student DataBaz
id 4, label 3, active
I might go further and separate "label" into a an actual label, and an index. As in the problem with id "3" could have index "1" and label "Warm Up Exercise 1".