- •Введение
- •Техническое задание
- •1. Описание предметной области
- •1.1 Общее описание предметной области
- •1.2 Описание входных документов и сообщений
- •1.3 Описание выходных документов и сообщений
- •1.4 Описание запросов к базе данных Запрос для отчёта
- •Запрос на выборку (Из одного города и факультета)
- •Запрос на выборку (Поиск по фио)
- •Запрос на выборку (Поиск студента по дате рождения)
- •Запрос на выборку (Средний бал #1)
- •Запрос на выборку (Средний балл: БаллыЕгэ)
- •Запрос на выборку (Стипендия с надбавкой 15%)
- •2.2. Нормализованная реляционная модель
- •3. Реализация базы данных в среде целевой субд
- •3.1. Структура базы данных а) состав файлов/таблиц баз данных
- •Б) структура и ключи файлов/таблиц баз данных
- •В) схема данных
- •3.2. Реализация ограничений базы данных
- •3.3. Интерфейс пользователя
- •Заключение
- •Список использованных источников
- •Приложения а. Глоссарий
Б) структура и ключи файлов/таблиц баз данных
Структура таблицы «Группы», представлена в таблице 7.
Таблица 7 – Структура таблицы «Группы»
Имя поля |
Тип данных |
Описание |
КодГруппы (Ключевое поле) |
Счетчик |
|
НомерГруппы |
Короткий текст |
|
КодФакультета |
Числовой |
|
ГодСоздания |
Числовой |
|
Структура таблицы «Дисциплины», представлена в таблице 8.
Таблица 8 – Структура таблицы «Дисциплины»
Имя поля |
Тип данных |
Описание |
КодДисциплины (Ключевое поле) |
Счетчик |
|
НазваниеДисциплины |
Короткий текст |
|
Часы |
Числовой |
|
Структура таблицы «Оценки», представлена в таблице 9.
Таблица 9 – Структура таблицы «Оценки»
Имя поля |
Тип данных |
Описание |
КодСтудента (Ключевое поле) |
Числовой |
|
КодДисциплины (Ключевое поле) |
Числовой |
|
Оценки |
Числовой |
|
Структура таблицы «Студенты», представлена в таблице 10.
Таблица 10 – Структура таблицы «Студенты»
Имя поля |
Тип данных |
Описание |
КодСтудента |
|
|
НомерЗачётки |
|
|
ФИО |
|
|
БаллыЕГЭ |
|
|
КодГруппы |
|
|
ДатаРождения |
|
|
Город |
|
|
Стипендия |
|
|
Структура таблицы «Факультеты», представлена в таблице 11.
Таблица 11 – Структура таблицы «Факультеты»
Имя поля |
Тип данных |
Описание |
КодФакультета |
|
|
Наименование |
|
|
Декан |
|
|
В) схема данных
Схема данных таблиц, представлена на рисунке 0.
Рисунок 31 – Схема данных таблиц
3.2. Реализация ограничений базы данных
Для исправной работы системы создадим функцию, которая накладывает дополнительные ограничения на невозможность вставки нескольких оценок за экзамен по одному предмету:
CREATE FUNCTION acad_perform_add (INTEGER, TEXT, TEXT, INTEGER, DATE, IN- TEGER) RETURNS VOID AS $$
BEGIN
IF (SELECT count(acad_perform.*)
FROM acad_perform LEFT JOIN control_point ON control_point.id = acad_perform.id_control_point
LEFT JOIN student ON acad_perform.id_student = student.id
LEFT JOIN form_control ON control_point.id_form_control = form_control.id
LEFT JOIN teach_disc_group ON control_point.id_teach_disc_group = teach_disc_group.id LEFT JOIN "group" ON "group".id = teach_disc_group.id_group
LEFT JOIN teach_disc ON teach_disc.id = teach_disc_group.id_teach_disc LEFT JOIN discipline ON discipline.id = teach_disc.id_discipline
WHERE form_control.name = $3 AND $3 = 'Экзамен' AND acad_perform.id_student = $1 AND "group".number = $4
AND discipline.name = $2) = 0
THEN INSERT INTO acad_perform(id_student, id_control_point, id_valuation) VALUES ($1, (SELECT control_point.id FROM control_point
LEFT JOIN form_control ON control_point.id_form_control = form_control.id LEFT JOIN teach_disc_group ON control_point.id_teach_disc_group =
teach_disc_group.id
LEFT JOIN "group" ON "group".id = teach_disc_group.id_group
LEFT JOIN teach_disc ON teach_disc.id = teach_disc_group.id_teach_disc LEFT JOIN discipline ON discipline.id = teach_disc.id_discipline
WHERE form_control.name = $3 AND "group".number = $4 AND discipline.name = $2 AND control_point.date = $5), (SELECT id
FROM valuation WHERE symbol = $6)); END IF;
END;
$$ LANGUAGE plpgsql;
Следующая функция вводит ограничение на вставку более двух кон- трольных точек в один день одной группе. А так же данная функция автома- тически по дате вставляет соответствующий семестр.
CREATE FUNCTION control_point_add (DATE, TEXT, INTEGER, TEXT, TEXT, TEXT) RETURNS VOID AS $$
BEGIN
IF (SELECT count(control_point.*)
FROM acad_perform LEFT JOIN control_point ON control_point.id = acad_perform.id_control_point
LEFT JOIN student ON acad_perform.id_student = student.id
LEFT JOIN form_control ON control_point.id_form_control = form_control.id
LEFT JOIN teach_disc_group ON control_point.id_teach_disc_group = teach_disc_group.id LEFT JOIN "group" ON "group".id = teach_disc_group.id_group
LEFT JOIN teach_disc ON teach_disc.id = teach_disc_group.id_teach_disc LEFT JOIN discipline ON discipline.id = teach_disc.id_discipline
WHERE "group".number = $4 AND control_point.date = $1) < 2 THEN
INSERT INTO control_point(date, id_form_control, id_teach_disc_group, id_semester) VALUES ($1,
(SELECT id FROM form_control WHERE name = $2), (SELECT teach_disc_group.id FROM teach_disc_group
LEFT JOIN "group" ON "group".id = teach_disc_group.id_group
LEFT JOIN teach_disc ON teach_disc.id = teach_disc_group.id_teach_disc LEFT JOIN discipline ON discipline.id = teach_disc.id_discipline
LEFT JOIN teacher ON teach_disc.id_teacher = teacher.id
WHERE "group".number = $3 AND teacher.surname = $4 AND teacher.name = $5 AND discipline.name = $6),
(SELECT id FROM semester WHERE $1 BETWEEN datebegin AND dateend)); END IF;
END;