Домашние задания

Домашнее задание 1. Установка и использование СУБД

  1. Установите систему управления реляционными базами данных.
  2. Узнайте, как в вашей СУБД исполнять SQL в интерактивном режиме.
  3. Узнайте, как в вашей СУБД исполнять SQL в пакетном режиме.
  4. Разберитесь, как в вашей СУБД осуществляется поддержка русского языка.
  5. Создайте базу данных и наполните ее в соответствии с примерами из презентации.

Ожидаемая структура проекта

  1. Текстовая часть
    1. Описание предметной области с кратким описанием неочевидных сущностей и атрибутов.
    2. Предварительное разбиение на отношения (может отсутствовать).
    3. Для каждого отношения: определение функциональных зависимостей, нормализация до 5НФ, денормализация (при необходимости).
    4. Модель сущность-связь.
    5. Физическая модель (должна соответствовать ERM) с указанием типов для доменов.
  2. Часть на SQL
    • ddl.sql – описание таблиц и индексов.
    • insert.sql – добавление тестовых данных.
    • select.sql – запросы на получение данных и представления.
    • update.sql – запросы на изменение данных, хранимые процедуры и триггеры.

В рамках проекта:

Домашнее задание 2. Моделирование БД «Университет»

Спроектируйте базу данных «Университет», позволяющую хранить информацию о студентах, группах, преподавателях, дисциплинах, оценках и клубах.

  1. Составьте модель сущность-связь.
  2. Преобразуйте модель сущность-связь в физическую модель.
  3. Запишите физическую модель на языке SQL. Запись должна включать объявления ограничений.
  4. Создайте базу данных по спроектированной модели.
  5. Запишите операторы SQL, заполняющие базу тестовыми данными. Достаточно 2–3 записей на таблицу, если они в полной мере демонстрируют особенности БД.

Примечания

  1. Не требуется поддержка:
    • нескольких университетов;
    • дисциплин по выбору;
    • дисциплин с необычным распределением по группам (таких как физическая культура и иностранный язык);
    • переводов между группами;
    • исторических данных;
    • нескольких оценок по одной дисциплине.
  2. Многосеместровые дисциплины считаются по семестрам, например:
    • Математический анализ (семестр 1);
    • Математический анализ (семестр 2).

Форма для сдачи ДЗ. Проверка проводится в полуавтоматическом режиме, поэтому строго соблюдайте указанные форматы.

В рамках проекта:

Домашнее задание 3. Функциональные зависимости в БД «Университет»

Дано отношение с атрибутами StudentId, StudentName, GroupId, GroupName, CourseId, CourseName, LecturerId, LecturerName, Mark, ClubId, ClubName, ClubPresidentId.

  1. Найдите функциональные зависимости в данном отношении.
  2. Найдите все ключи данного отношения.
  3. Найдите замыкания множеств атрибутов:
    1. GroupId, CourseId;
    2. StudentId, CourseId;
    3. StudentId, LecturerId;
    4. StudentId, ClubId;
    5. StudentId, ClubPresidentId;
    6. GroupName, LecturerId.
  4. Найдите неприводимое множество функциональных зависимостей для данного отношения.

Примечания

  1. Не требуется поддержка:
    • нескольких университетов;
    • дисциплин по выбору;
    • дисциплин с необычным распределением по группам (таких как физическая культура и иностранный язык);
    • переводов между группами;
    • нескольких оценок по одной дисциплине.
  2. Многосеместровые дисциплины считаются по семестрам, например: Математический анализ (семестр 1), Математический анализ (семестр 2).

Форма для сдачи ДЗ. Проверка проводится в полуавтоматическом режиме, поэтому строго соблюдайте указанные форматы.

В рамках проекта:

  1. Определите набор атрибутов, необходимых для проекта, и определите отношения на них.
  2. Найдите функциональные зависимости полученных отношений.
  3. Найдите все ключи полученных отношений.
  4. Найдите неприводимые множества функциональных зависимостей для полученных отношений.

Домашнее задание 4. Нормализация БД «Университет»

Дано отношение.

  • Атрибуты: StudentId, StudentName, GroupId, GroupName, CourseId, CourseName, LecturerId, LecturerName, ClubId, ClubName, ClubStudentHeadId, Mark.
  • Функциональные зависимости:
    • StudentId → StudentName, GroupId, GroupName;
    • GroupId → GroupName;
    • GroupName → GroupId;
    • CourseId → CourseName;
    • LecturerId → LecturerName;
    • StudentId, CourseId → Mark;
    • GroupId, CourseId → LecturerId;
    • ClubId → ClubName;
    • ClubName → ClubId, ClubStudentHeadId.
  • Множественные зависимости (не все):
    • GroupName ↠ StudentId;
    • GroupName ↠ CourseId;
    • ClubName ↠ StudentId.
  1. Инкрементально приведите данное отношение в пятую нормальную форму.
  2. Постройте соответствующую модель сущность-связь.
  3. Постройте соответствующую физическую модель.
  4. Реализуйте SQL-скрипты, создающие схему базы данных.
  5. Создайте базу данных по спроектированной модели.
  6. Заполните базу тестовыми данными.

Форма для сдачи ДЗ

В рамках проекта:

  1. Приведите схему базы в пятую нормальную форму.
  2. Если итоговая схема не будет в НФ-5, то обоснуйте принятое решение.
  3. Запишите определения таблиц на языке SQL.
  4. Запишите на языке SQL наполнение таблиц тестовым данными.

Домашнее задание 5. Реляционная алгебра

Структура базы данных «Университет»:

Составьте выражения реляционной алгебры и соответствующие SQL-запросы, позволяющие получать

  1. Информацию о студентах

    1. С заданным идентификатором (StudentId, StudentName, GroupId по :StudentId).

    2. С заданным ФИО (StudentId, StudentName, GroupId по :StudentName).

  2. Полную информацию о студентах

    1. С заданным идентификатором (StudentId, StudentName, GroupName по :StudentId).

    2. С заданным ФИО (StudentId, StudentName, GroupName по :StudentName).

    3. Из заданной группы (StudentId, StudentName, GroupName по :GroupName).

    4. Заданного клуба (StudentId, StudentName, GroupName по :ClubName).

    5. Клуба по руководителю (StudentId, StudentName, GroupName по :StudentName).

  3. Информацию о студентах с заданной оценкой по дисциплине

    1. С заданным идентификатором (StudentId, StudentName, GroupId по :Mark, :CourseId).

    2. С заданным названием (StudentId, StudentName, GroupId по :Mark, :CourseName).

    3. Которую у него вёл лектор заданный идентификатором (StudentId, StudentName, GroupId по :Mark, :LecturerId).

    4. Которую у них вёл лектор, заданный ФИО (StudentId, StudentName, GroupId по :Mark, :LecturerName).

    5. Которую вёл лектор, заданный идентификатором (StudentId, StudentName, GroupId по :Mark, :LecturerId).

    6. Которую вёл лектор, заданный ФИО (StudentId, StudentName, GroupId по :Mark, :LecturerName).

  4. Информацию о студентах не имеющих оценки по дисциплине

    1. Среди всех студентов (StudentId, StudentName, GroupId по :CourseName).

    2. Среди всех студентов (StudentId, StudentName, GroupId по :CourseName).

    3. Среди участников клуба (StudentId, StudentName, GroupId по :CourseName, :ClubName).

    4. Среди студентов, у которых есть эта дисциплина (StudentId, StudentName, GroupId по :CourseName).

  5. Для каждого студента ФИО и названия дисциплин

    1. Которые у него есть по плану (StudentName, CourseName).

    2. Есть, но у него нет оценки (StudentName, CourseName).

    3. Есть, но у него не 4 или 5 (StudentName, CourseName).

    4. Вёл преподаватель (StudentName, CourseName по :LecturerName).

    5. Участников клуба (StudentName, CourseName по :ClubName).

    6. Соклубники (StudentName1, StudentName2, ClubName).

    7. Руководители клубов (StudentName, CourseName).

  6. Идентификаторы студентов по преподавателю

    1. Имеющих хотя бы одну оценку у преподавателя (StudentId по :LecturerName).

    2. Не имеющих ни одной оценки у преподавателя (StudentId по :LecturerName).

    3. Имеющих оценки по всем дисциплинам преподавателя (StudentId по :LecturerName).

    4. Имеющих оценки по всем дисциплинам преподавателя, которые он вёл у этого студента (StudentId по :LecturerName).

  7. Группы и дисциплины, такие что все студенты группы имеют оценку по этой дисциплине

    1. Идентификаторы (GroupId, CourseId).

    2. Названия (GroupName, CourseName).

Составьте SQL-запросы, позволяющие получать

  1. Суммарный балл

    1. Одного студента (SumMark по :StudentId).

    2. Каждого студента (StudentName, SumMark).

    3. Каждой группы (GroupName, SumMark).

  2. Средний балл

    1. Одного студента (AvgMark по :StudentId).

    2. Каждого студента (StudentName, AvgMark).

    3. Каждой группы (GroupName, AvgMark).

    4. Средний балл средних баллов студентов каждой группы (GroupName, AvgAvgMark).

  3. Для каждого студента: число дисциплин, которые у него были, число сданных дисциплин и число несданных дисциплин (StudentId, Total, Passed, Failed).

Тестовый полигон

Технические особенности проверки.

Домашнее задание 6. Реляционное исчисление

Составьте запросы в терминах языков Datalog и SQL для базы данных «Университет», позволяющие получать

  1. Информацию о студентах

    1. С заданным ФИО (StudentId, StudentName, GroupId по :StudentName).

    2. Учащихся в заданной группе (StudentId, StudentName, GroupId по :GroupName).

    3. Участниках клуба (StudentId, StudentName, GroupId по :ClubName).

    4. C заданной оценкой по дисциплине, заданной идентификатором (StudentId, StudentName, GroupId по :Mark, :CourseId).

    5. C заданной оценкой по дисциплине, заданной названием (StudentId, StudentName, GroupId по :Mark, :CourseName).

  2. Полную информацию о студентах

    1. Для всех студентов (StudentId, StudentName, GroupName).

    2. Участниках клуба (StudentId, StudentName, GroupName по :ClubName).

    3. Участниках клуба по руководителю (StudentId, StudentName, GroupName по :StudentName).

    4. Студентов, не имеющих оценки по дисциплине, заданной идентификатором (StudentId, StudentName, GroupName по :CourseId).

    5. Студентов, не имеющих оценки по дисциплине, заданной названием (StudentId, StudentName, GroupName по :CourseName).

    6. Студентов, не имеющих оценки по дисциплине, у которых есть эта дисциплина (StudentId, StudentName, GroupName по :CourseId).

    7. Студентов, не имеющих оценки по дисциплине, у которых есть эта дисциплина (StudentId, StudentName, GroupName по :CourseName).

  3. Студенты и дисциплины, такие что у студента была дисциплина (по плану или есть оценка)

    1. Идентификаторы (StudentId, CourseId).

    2. Имя и название (StudentName, CourseName).

    3. Имя и название по клубу (StudentName, CourseName по :ClubName).

    4. Соклубников, изучавших один предмет (StudentName1, StudentName2, CourseName).

  4. Студенты и дисциплины, такие что дисциплина есть в его плане, и у студента долг по этой дисциплине

    1. Долгом считается отсутствие оценки (StudentName, CourseName).

    2. Долгом считается оценка не выше 2 (StudentName, CourseName).

    3. Долгом считается отсутствие оценки или оценка не выше 2 (StudentName, CourseName).

  5. Идентификаторы студентов по преподавателю

    1. Имеющих хотя бы одну оценку у преподавателя (StudentId по :LecturerName).

    2. Не имеющих ни одной оценки у преподавателя (StudentId по :LecturerName).

    3. Имеющих оценки по всем дисциплинам преподавателя (StudentId по :LecturerName).

    4. Имеющих оценки по всем дисциплинам преподавателя, которые он вёл у этого студента (StudentId по :LecturerName).

  6. Группы и дисциплины, такие что все студенты группы имеют оценку по предмету

    1. Идентификаторы (GroupId, CourseId).

    2. Названия (GroupName, CourseName).

Примечания

  1. В Datalog итоговым считается последнее объявленное отношение.
  2. Текущая реализация Datalog не поддерживает рекурсивные определения.
  3. В SQL-запросах нельзя использовать * join.
  4. SQL проверяется четырьмя тестами на фазу — с разными СУБД. Первая СУБД — SQLite, как на тестовом полигоне.

В рамках проекта:

  1. Определите запросы (в том числе, агрегирующие), необходимые для работы проекта.
  2. Реализуйте запросы на языке SQL.