Когда вы используете простой плоский файл, содержащий всю эту информацию, легко получить информацию из синхронизации.То есть один и тот же идентификатор студента, связанный с несколькими именами, или один и тот же идентификатор класса, связанный с несколькими именами классов.Кроме того, требуется дополнительная работа для обеспечения синхронизации, если имя ученика или имя класса необходимо изменить.Не говоря уже о необходимости минимизировать дублирующиеся записи.Первый шаг к тому, чтобы разобраться в этом беспорядке, - изменить дизайн базы данных.Для данных, которые вы упомянули здесь, я бы использовал три таблицы:
Students
ID Name
------------ ---------------------------------
1 Henry
2 Molly
3 George
Classes
ID Name
------------ --------------------------------
1 Ohio History
2 US History
3 World History
Grades
StudentID ClassID Grade LetterGrade
------------ ------------ ------------ ------------
1 1 98 A
2 3 85 B
3 2 77 C
1 2 85 B
3 3 92 A
Задайте первичный ключ для учеников и классов в поле идентификатора, а для классов - составной из (StudentID, ClassID).Это предотвратит наличие у одного учащегося нескольких оценок за один и тот же класс, а также у нескольких учеников одинаковый идентификатор.То же самое для классов.
Теперь ваш пользовательский интерфейс может позволить пользователю выбрать ученика, выбрать класс, а затем назначить оценку.Буквенная оценка может быть рассчитана или введена.
Вот как я бы определил таблицы:
create table if not exists students (
id integer primary key autoincrement,
last_name varchar,
first_name varchar);
create table if not exists classes (
id integer primary key autoincrement,
name varchar);
create table if not exists grades (
student_id integer not null,
class_id integer not null,
point_grade integer,
letter_grade varchar,
primary key (student_id, class_id),
foreign key (student_id) references students,
foreign key (class_id) references classes)
without rowid;
Ограничения внешнего ключа не позволяют вводить оценки для несуществующих учащихся или классов, а также предотвращают удаление учащихся или классов с оценками.Существуют и другие положения, позволяющие вам удалить все оценки ученика или класса, если ученик или класс удаляются.
Отношение между учениками и классами называется отношением «многие ко многим».Это означает, что многие ученики могут быть назначены одному классу, а многие классы могут быть назначены одному ученику.Не то чтобы единственными ключами, которые являются автоматическими приращениями, являются идентификаторы ученика и класса.Идентификаторы в файле оценок ссылаются на соответствующие строки ученика и класса.В приведенном выше примере данных у Генри есть оценки по двум классам (История Огайо (98) и История США (85)), у Молли есть оценки только по одному классу (Всемирная история (85)), а у Джорджа есть оценки по двум классам (США).История (77) и Всемирная история (92)).
Вы можете создать единое представление, объединяющее классы учащихся и оценки следующим образом:
create view if not exists student_view (
last_name, first_name, class_name, point_grade, letter_grade)
as (
select last_name, first_name, name, point_grade, letter_grade
from students
join grades on grades.student_id = students.id
join classes on classes.id = grades.class_id;