Глава 22. Дизайн БД «Олимпиады»

Дадим новой базе данных имя olymp. Разместим в ней три таблицы pupil, olymp и result.

В таблице pupil было бы неразумно хранить номер класса — каждый год номер увеличивается при переходе в следующий класс. Можно было бы увеличивать класс каждый год запросом UPDATE:

UPDATE pupil SET class=class+1;

Однако в этом случае пришлось бы помнить о необходимости такого обновления каждый год первого сентября. И ни в коем случае не сделать такой запрос дважды в год. Мы поступим иначе: заведём в таблице pupil поле graduate, в котором будет храниться год окончания школы. Тогда можно будет вычислить, в каком классе ученик учился или будет учиться в таком-то году или в настоящее время. Точно так же разумно хранить дату рождения человека, а его возраст определять в результате вычисления. Как это делается, мы расскажем в ???.

Заметим, что олимпиад по одному и тому же предмету может быть много. В каждой записи, посвящённой олимпиаде, хранить название предмета (русский язык, математика, физика, химия, информатика) было бы расточительно. Лучше создать дополнительную таблицу subject с названиями предметов, и связать с ней таблицу с олимпиадами. Для связи предлагаем кодировать предметы с помощью одной латинской буквы (R=русский язык и литература, M=математика, P=физика, C=химия, I=информатика).

Теперь определимся с таблицами и их полями:

pupil
id SERIAL
идентификационный номер
name TEXT
фамилия, имя
school TEXT
номер или название школы
graduate INTEGER
год окончания школы
olymp
id SERIAL
идентификационный номер
date DATE
дата проведения
subject_id CHARACTER
код предмета
class INTEGER
класс
result_max INTEGER
максимальный результат
result
result INTEGER
результат
pupil_id INTEGER
идентификационный номер школьника
olymp_id INTEGER
идентификационный номер олимпиады
subject
id CHARACTER
код предмета
name TEXT
название предмета

Информатика-54