Домашнее задание 1. Установка и использование СУБД
- Установите систему управления реляционными базами данных.
- Узнайте, как в вашей СУБД исполнять SQL в интерактивном режиме.
- Узнайте, как в вашей СУБД исполнять SQL в пакетном режиме.
- Разберитесь, как в вашей СУБД осуществляется поддержка русского языка.
- Создайте базу данных и наполните ее в соответствии с примерами из презентации.
Ожидаемая структура проекта
-
Текстовая часть
- Описание предметной области с кратким описанием неочевидных сущностей и атрибутов.
- Предварительное разбиение на отношения (может отсутствовать).
- Для каждого отношения: определение функциональных зависимостей, нормализация до 5НФ, денормализация (при необходимости).
- Модель сущность-связь.
- Физическая модель (должна соответствовать ERM) с указанием типов для доменов.
-
Часть на SQL
ddl.sql
– описание таблиц и индексов.insert.sql
– добавление тестовых данных.select.sql
– запросы на получение данных и представления.update.sql
– запросы на изменение данных, хранимые процедуры и триггеры.
В рамках проекта:
-
Выберите тему проекта.
- Тема должна быть уникальной.
- Тема должна быть достаточно сложной.
- Нельзя брать темы: обучение в университете; торговля (как товарами, так и билетами); cоревнования по программированию.
Домашнее задание 2. Моделирование БД «Университет»
Спроектируйте базу данных «Университет», позволяющую хранить информацию о факультетах, студентах, группах, преподавателях, дисциплинах и оценках.
- Составьте модель сущность-связь.
- Преобразуйте модель сущность-связь в физическую модель.
- Запишите физическую модель на языке SQL. Запись должна включать объявления ограничений.
- Создайте базу данных по спроектированной модели.
- Запишите операторы SQL, заполняющие базу тестовыми данными. Достаточно 2–3 записей на таблицу, если они в полной мере демонстрируют особенности БД.
Примечания
-
Не требуется поддержка:
- нескольких университетов;
- дисциплин по выбору;
- дисциплин с необычным распределением по группам (таких как физическая культура и иностранный язык);
- переводов между группами;
- исторических данных;
- нескольких оценок по одной дисциплине.
-
Многосеместровые дисциплины считаются по семестрам,
например:
- Математический анализ (семестр 1);
- Математический анализ (семестр 2).
Форма для сдачи ДЗ. Проверка проводится в полуавтоматическом режиме, поэтому строго соблюдайте указанные форматы.
В рамках проекта:
-
Сделайте предварительную схему для БД проекта на основе моделей:
- модель сущность-связь;
- физическая модель;
- определение схемы на SQL.
Домашнее задание 3. Функциональные зависимости в БД «Университет»
Дано отношение с атрибутами StudentId, StudentName, GroupId, GroupName, GroupFacultyId, CourseId, CourseName, LecturerId, LecturerName, LecturerFacultyId, Mark, FacultyId, FacultyName, FacultyDeanId.
- Найдите функциональные зависимости в данном отношении.
- Найдите все ключи данного отношения.
-
Найдите замыкание множеств атрибутов:
- GroupId, CourseId;
- StudentId, CourseId;
- StudentId, LecturerId;
- StudentId, LecturerFacultyDeanId;
- GroupName, LecturerId.
- Найдите неприводимое множество функциональных зависимостей для данного отношения.
Примечания
-
Не требуется поддержка:
- нескольких университетов;
- дисциплин по выбору;
- дисциплин с необычным распределением по группам (таких как физическая культура и иностранный язык);
- переводов между группами;
- нескольких оценок по одной дисциплине.
- Многосеместровые дисциплины считаются по семестрам, например: Математический анализ (семестр 1), Математический анализ (семестр 2).
Форма для сдачи ДЗ. Проверка проводится в полуавтоматическом режиме, поэтому строго соблюдайте указанные форматы.
В рамках проекта:
- Определите набор атрибутов, необходимых для проекта, и определите отношения на них.
- Найдите функциональные зависимости полученных отношений.
- Найдите все ключи полученных отношений.
- Найдите неприводимые множества функциональных зависимостей для полученных отношений.
Домашнее задание 4. Нормализация БД «Университет»
Дано отношение с атрибутами StudentId, StudentName, GroupId, GroupName, GroupFacultyId, GroupFacultyName, GroupFacultyDeanId; CourseId, CourseName, LecturerId, LecturerName, LecturerFacultyId, LecturerFacultyName, LecturerFacultyDeanId, Mark. и функциональными зависимостями:
- StudentId → StudentName, GroupId, GroupName;
- GroupId → GroupName, GroupFacultyId;
- GroupName → GroupId;
- CourseId → CourseName;
- LecturerId → LecturerName, LecturerFacultyId;
- StudentId, CourseId → Mark;
- GroupId, CourseId → LecturerId;
- GroupFacultyId → GroupFacultyName, GroupFacultyDeanId;
- GroupFacultyName → GroupFacultyId;
- LecturerFacultyId → LecturerFacultyName, LecturerFacultyDeanId;
- LecturerFacultyName → LecturerFacultyId.
- Инкрементально приведите данное отношение в пятую нормальную форму.
- Постройте соответствующую модель сущность-связь.
- Постройте соответствующую физическую модель.
- Реализуйте SQL-скрипты, создающие схему базы данных.
- Создайте базу данных по спроектированной модели.
- Заполните базу тестовыми данными.
В рамках проекта:
- Приведите схему базы в пятую нормальную форму.
- Если итоговая схема не будет в НФ-5, то обоснуйте принятое решение.
- Запишите определения таблиц на языке SQL.
- Запишите на языке SQL наполнение таблиц тестовым данными.
Домашнее задание 5. Реляционная алгебра
Структура базы данных «Университет»:
- Faculties(FacultyId, FacultyName, DeanId)
- Groups(GroupId, GroupName, GroupFacultyId)
- Students(StudentId, StudentName, GroupId)
- Courses(CourseId, CourseName)
- Lecturers(LecturerId, LecturerName, LecturerFacultyId)
- Plan(GroupId, CourseId, LecturerId)
- Marks(StudentId, CourseId, Mark)
Составьте выражения реляционной алгебры и соответствующие SQL-запросы, позволяющие получать
Информацию о студентах
С заданным идентификатором (StudentId, StudentName, GroupId по :StudentId).
С заданным ФИО (StudentId, StudentName, GroupId по :StudentName).
Полную информацию о студентах
С заданным идентификатором (StudentId, StudentName, GroupName по :StudentId).
С заданным ФИО (StudentId, StudentName, GroupName по :StudentName).
Из заданной группы (StudentId, StudentName, GroupName по :GroupName).
C заданного факультета (StudentId, StudentName, GroupName по :FacultyName).
C факультета, заданного деканом (StudentId, StudentName, GroupName по :LecturerName).
Информацию о студентах с заданной оценкой по дисциплине
С заданным идентификатором (StudentId, StudentName, GroupId по :Mark, :CourseId).
С заданным названием (StudentId, StudentName, GroupId по :Mark, :CourseName).
Которую у него вёл лектор заданный идентификатором (StudentId, StudentName, GroupId по :Mark, :LecturerId).
Которую у них вёл лектор, заданный ФИО (StudentId, StudentName, GroupId по :Mark, :LecturerName).
Которую вёл лектор, заданный идентификатором (StudentId, StudentName, GroupId по :Mark, :LecturerId).
Которую вёл лектор, заданный ФИО (StudentId, StudentName, GroupId по :Mark, :LecturerName).
Информацию о студентах не имеющих оценки по дисциплине
Среди всех студентов (StudentId, StudentName, GroupId по :CourseName).
Тут был дубль задачи, пункт оставлен для сохранения нумерации.
Среди студентов факультета (StudentId, StudentName, GroupId по :CourseName, :FacultyName).
Среди студентов, у которых есть эта дисциплина (StudentId, StudentName, GroupId по :CourseName).
Для каждого студента ФИО и названия дисциплин
Которые у него есть по плану (StudentName, CourseName).
Есть, но у него нет оценки (StudentName, CourseName).
Есть, но у него не 4 или 5 (StudentName, CourseName).
Вёл преподаватель (StudentName, CourseName по :LecturerName).
Вёл преподаватель с :FacultyName (StudentName, CourseName по :FacultyName).
Вёл преподаватель другого факультета (StudentName, CourseName).
Вёл декан (StudentName, CourseName).
Идентификаторы студентов по преподавателю
Имеющих хотя бы одну оценку у преподавателя (StudentId по :LecturerName).
Не имеющих ни одной оценки у преподавателя (StudentId по :LecturerName).
Имеющих оценки по всем дисциплинам преподавателя (StudentId по :LecturerName).
Имеющих оценки по всем дисциплинам преподавателя, которые он вёл у этого студента (StudentId по :LecturerName).
Группы и дисциплины, такие что все студенты группы имеют оценку по этой дисциплине
Идентификаторы (GroupId, CourseId).
Названия (GroupName, CourseName).
Составьте SQL-запросы, позволяющие получать
Суммарный балл
Одного студента (SumMark по :StudentId).
Каждого студента (StudentName, SumMark).
Каждой группы (GroupName, SumMark).
Средний балл
Одного студента (AvgMark по :StudentId).
Каждого студента (StudentName, AvgMark).
Каждой группы (GroupName, AvgMark).
Средний балл средних баллов студентов каждой группы (GroupName, AvgAvgMark).
Для каждого студента: число дисциплин, которые у него были, число сданных дисциплин и число несданных дисциплин (StudentId, Total, Passed, Failed).
Технические особенности проверки.
- Сдача — в PCMS. Если у вас нет аккаунта в PCMS, либо доступа к ДЗ, обратитесь к Николаю Викторовичу Ведерникову.
- Проверяться и оцениваться будет последняя посланная версия.
-
Проверка разделена на 4 фазы:
- пустые таблицы (синтаксис и набор столбцов);
- таблицы с не более чем одной записью;
- таблицы с простыми данными;
- таблицы со сложными данными.
- В случае проблем с синтаксисом или набором столбцов вы будете получать Presentation Error.
- Реляционная алгебра проверяется одним тестом на фазу, движком из тестового полигона.
- SQL проверяется тремя тестами на фазу — с разными СУБД. Первая СУБД — SQLite, как на тестовом полигоне.
-
Известные спецэффекты:
-
SQLite поддерживает только
left join
.right
иоuter join
делаются через него. -
Все вложенные запросы надо именовать, даже если вы не будете
использовать это имя:
select ... from ... (select ... ) SubQueryName ...
- Используйте данные из минимально возможного набора таблиц.
-
SQLite поддерживает только
Домашнее задание 6. Реляционное исчисление
Составьте запросы в терминах языков Datalog и SQL для базы данных «Университет», позволяющие получать
-
Информацию о студентах
- С заданным ФИО (StudentId, StudentName, GroupId по :StudentName).
- Учащихся в заданной группе (StudentId, StudentName, GroupId по :GroupName).
- Учащихся на заданном факультете (StudentId, StudentName, GroupId по :FacultyName).
- C заданной оценкой по дисциплине, заданной идентификатором (StudentId, StudentName, GroupId по :Mark, :CourseId).
- C заданной оценкой по дисциплине, заданной названием (StudentId, StudentName, GroupId по :Mark, :CourseName).
-
Полную информацию о студентах
- Для всех студентов (StudentId, StudentName, GroupName).
- Учащихся на заданном факультете (StudentId, StudentName, GroupName по :FacultyName).
- C факультета, заданного деканом (StudentId, StudentName, GroupName по :LecturerName).
- Студентов, не имеющих оценки по дисциплине, заданной идентификатором (StudentId, StudentName, GroupName по :CourseId).
- Студентов, не имеющих оценки по дисциплине, заданной названием (StudentId, StudentName, GroupName по :CourseName).
- Студентов, не имеющих оценки по дисциплине, у которых есть эта дисциплина (StudentId, StudentName, GroupName по :CourseId).
- Студентов, не имеющих оценки по дисциплине, у которых есть эта дисциплина (StudentId, StudentName, GroupName по :CourseName).
-
Студенты и дисциплины, такие что у студента была дисциплина
(по плану или есть оценка)
- Идентификаторы (StudentId, CourseId).
- Имя и название (StudentName, CourseName).
- Имя и название, преподаватель того же факультета (StudentName, CourseName).
- Имя и название, преподаватель другого факультета (StudentName, CourseName).
-
Студенты и дисциплины, такие что
дисциплина есть в его плане,
и у студента долг по этой дисциплине
- Долгом считается отсутствие оценки (StudentName, CourseName).
- Долгом считается оценка не выше 2 (StudentName, CourseName).
- Долгом считается отсутствие оценки или оценка не выше 2 (StudentName, CourseName).
-
Идентификаторы студентов по преподавателю
- Имеющих хотя бы одну оценку у преподавателя (StudentId по :LecturerName).
- Не имеющих ни одной оценки у преподавателя (StudentId по :LecturerName).
- Имеющих оценки по всем дисциплинам преподавателя (StudentId по :LecturerName).
- Имеющих оценки по всем дисциплинам преподавателя, которые он вёл у этого студента (StudentId по :LecturerName).
-
Группы и дисциплины, такие что
все студенты группы имеют оценку по предмету
- Идентификаторы (GroupId, CourseId).
- Названия (GroupName, CourseName).
Примечания
- В Datalog итоговым считается последнее объявленное отношение.
- Текущая реализация Datalog не поддерживает рекурсивные определения.
- В SQL-запросах нельзя использовать
* join
. - SQL проверяется четырьмя тестами на фазу — с разными СУБД. Первая СУБД — SQLite, как на тестовом полигоне.
В рамках проекта:
- Определите запросы (в том числе, агрегирующие), необходимые для работы проекта.
- Реализуйте запросы на языке SQL.
Домашнее задание 7. Изменение данных
Реализуйте указанные запросы, представления, проверки и триггеры на языке SQL.
-
Напишите запросы, удаляющие студентов
- Учащихся в группе, заданной идентификатором (GroupId).
- Учащихся в группе, заданной названием (GroupName).
- Учащихся на факультете (FacultyName).
- Без оценок.
- Имеющих 3 и более оценки.
- Имеющих 3 и менее оценки.
-
Напишите запросы, удаляющие должников (здесь и далее, долг определяется по отсутствию оценки)
- Студентов, c долгами.
- Студентов, имеющих 2 и более долга.
- Студентов, имеющих 2 и более долга, учащихся на факультете (FacultyName).
- Студентов, имеющих не более 3 долгов.
-
Напишите запросы, обновляющие данные студентов
- Изменение имени студента (StudentId, StudentName).
- Перевод студента из группы в группу по индентификаторам (StudentId, GroupId, FromGroupId).
- Перевод всех студентов из группы в группу по идентификаторам (GroupId, FromGroupId).
- Изменение имени всех студентов группы (GroupName, StudentName).
- Перевод всех студентов из группы в группу по названиям (GroupName, FromGroupName).
- Перевод всех студентов из группы в группу, только если целевая группа существует (GroupName, FromGroupName).
-
Напишите запросы, подсчитывающие статистику по оценкам
- Число оценок студента (столбец Students.Marks) (StudentId).
- Число оценок каждого студента (столбец Students.Marks).
- Число оценок каждого студента факультета (столбец Students.Marks) (FacultyName).
- Пересчет числа оценок каждого студента, с учётом новых оценок из таблицы NewMarks, структура которой такая же как у таблицы Marks (столбец Students.Marks).
-
Напишите запросы, подсчитывающие статистику по студентам
- Число сданных дисциплин каждого студента (столбец Students.Marks).
- Число долгов студента (столбец Students.Debts) (StudentId).
- Число долгов каждого студента (столбец Students.Debts).
- Число долгов каждого студента группы (столбец Students.Debts) (GroupName).
- Число долгов каждого студента у деканов (столбец Students.Debts) (GroupName).
- Число оценок и долгов каждого студента (столбцы Students.Marks, Students.Debts).
-
Напишите запросы, обновляющие оценки,
с учетом данных из таблицы NewMarks,
имеющей такую же структуру, как таблица Marks
- Проставляющий новую оценку только если ранее оценки не было.
- Проставляющий новую оценку только если ранее оценка была.
- Проставляющий максимум из старой и новой оценки только если ранее оценка была.
- Проставляющий максимум из старой и новой оценки (если ранее оценки не было, то новую оценку).
-
Работа с представлениями
- Создайте представление StudentMarks в котором для каждого студента указано число оценок (StudentId, Marks).
- Создайте представление AllMarks в котором для каждого студента указано число оценок, включая оценки из таблицы NewMarks (StudentId, Marks).
- Создайте представление Debts в котором для каждого студента, имеющего долги указано их число (StudentId, Debts).
- Создайте представление StudentDebts в котором для каждого студента указано число долгов (StudentId, Debts).
Целостность данных.
Обратите внимание, что задания из этого раздела надо посылать в PCMS, но они будут проверяться только вручную после окончания сдачи. То есть в PCMS вы получите + за любое решение.
В комментарии перед каждым запросом укажите название и версию использованной СУБД.
- Добавьте проверку того, что у студентов есть оценки только по дисциплинам из их плана (NoExtraMarks).
- Добавьте проверку того, что все студенты каждой группы имеют оценку по одному и тому же набору дисциплин (SameMarks).
- Создайте триггер PreserveMarks, не позволяющий уменьшить оценку студента по дисциплине. При попытке такого изменения оценка изменяться не должна.
Примечания
- Некоторые базы данных не понимают, что * join ... using (Column) должен оставлять один экземпляр Column и не требовать указывать для него таблицу.
В рамках проекта:
- Определите модифицирующие запросы, необходимые для работоспособности проекта.
- Запишите эти запросы на языке SQL.
- Определите представления, необходимые для работоспособности проекта.
- Запишите эти представления на языке SQL.
Домашнее задание 8. Индексирование
- Определите, какие индексы требуется добавить к таблицам базы данных «Университет» на основе запросов из ДЗ-5, 6 и 7.
- Пусть частым запросом является определение среднего балла студентов факультета по дисциплине. Как будет выглядеть запрос и какие индексы могут помочь при его исполнении?
- Придумайте три запроса, требующих новых индексов и запишите их. Если в результате, некоторые из старых индексов станут бесполезными, удалите их.
При выполнении задания считайте, что ФЗ соответствуют полученным в ДЗ-3 и 4.
В рамках проекта:
- Определите индексы и их типы, необходимые для эффективного исполнения запросов.
- Запишите определения индексов на языке SQL.
Домашнее задание 9. Хранимые процедуры
В базе данных Airline
информация о рейсах
самолётов задана в виде таблиц
Flights( FlightId integer, FlightTime timestamp, PlaneId integer, -- Дополнительные столбцы, при необходимости ) Seats( PlaneId integer, SeatNo varchar(4), -- 123A -- Дополнительные столбцы, при необходимости )
Реализуйте запросы к базе данных Airline
с применением представлений, хранимых процедур и функций.
При необходимости, вы можете создать дополнительные
таблицы, представления и хранимые процедуры.
Возможность бронирования должна автоматически отключаться за трое суток до начала рейса. Продажа мест должна автоматически отключаться за три часа до начала рейса. Также должна быть предусмотрена возможность отключения бронирования и продаж вручную.
-
Администрирование.
RegisterUser(UserId, Pass)
— зарегистрировать нового пользователя. Возвращает истину, если удалось и ложь — в противном случае.ManageFlight(UserId, Pass, FlightId, SellAllowed, ReservationAllowed)
— изменить настройки рейса. Примечание: автоматические настройки имеют более высокий приоритет.
-
Покупка и бронирование.
FreeSeats(FlightId)
— список мест рейса, доступных для продажи и для бронирования.Reserve(UserId, Pass, FlightId, SeatNo)
— бронирует место на сутки начиная с момента бронирования. Возвращает истину, если удалось и ложь — в противном случае.ExtendReservation(UserId, Pass, FlightId, SeatNo)
— продлевает бронь места на сутки начиная с момента продления. Возвращает истину, если удалось и ложь — в противном случае.BuyFree(FlightId, SeatNo)
— покупает свободное место. Возвращает истину, если удалось и ложь — в противном случае.BuyReserved(UserId, Pass, FlightId, SeatNo)
— покупает забронированное место (пользователи должны совпадать). Возвращает истину, если удалось и ложь — в противном случае.
-
Статистика.
FlightsStatistics(UserId, Pass)
— статистика по рейсам: возможность бронирования и покупки, число свободных, забронированных и проданных мест.FlightStat(UserId, Pass, FlightId)
— статистика по рейсу: возможность бронирования и покупки, число свободных, забронированных и проданных мест.
CompressSeats(UserId, Pass, FlightId)
— оптимизирует занятость мест в самолете. В результате оптимизации, в начале самолета должны быть купленные места, затем — забронированные, а в конце — свободные. Примечание: клиенты, которые уже выкупили билеты, также должны быть пересажены.
В рамках проекта:
- Определите хранимые процедуры и функции, необходимые для работы проекта.
- Реализуйте хранимые процедуры (функции) на языке SQL.