Домашнее задание 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 поддерживает только